diff --git a/.deployignore b/.deployignore deleted file mode 100644 index 56180bf5..00000000 --- a/.deployignore +++ /dev/null @@ -1,22 +0,0 @@ -.DS_Store -Thumbs.db -wp-cli.local.yml -node_modules/ -*.sql -*.tar.gz -*.zip -.phpunit.result.cache -Dockerfile -output.log -.github -tests -bin -composer.lock -.phpcs.xml -phpunit.xml -configure.php -DOCKER_ENV -phpunit.xml -tests -.phpcs -Makefile diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 115b12e2..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,25 +0,0 @@ -# Please see the documentation for all configuration options: -# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - - - package-ecosystem: "composer" - directory: "/" - schedule: - interval: "weekly" - - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "weekly" - day: "saturday" - time: "09:00" - timezone: "America/New_York" - ignore: - - dependency-name: "@wordpress/*" diff --git a/.github/workflows/all-pr-tests.yml b/.github/workflows/all-pr-tests.yml deleted file mode 100644 index f2397763..00000000 --- a/.github/workflows/all-pr-tests.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: "All Pull Request Tests" - -on: - pull_request: - branches: - - develop - types: [opened, synchronize, reopened, ready_for_review] - -jobs: - # We use a single job to ensure that all steps - # run in the same environment and reduce the number of minutes used. - pr-tests: - # Don't run on draft PRs - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - # Timeout after 10 minutes - timeout-minutes: 10 - # Define a matrix of PHP/WordPress versions to test against - strategy: - matrix: - php: [8.1, 8.2, 8.3] - wordpress: ["latest"] - # Cancel any existing runs of this workflow - concurrency: - group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }}-P${{ matrix.php }}-WP${{ matrix.wordpress }} - cancel-in-progress: true - # Name the job in the matrix - name: "PR Tests PHP ${{ matrix.php }} WordPress ${{ matrix.wordpress }}" - - steps: - - uses: actions/checkout@v4 - - - name: Run General Tests - # See https://github.com/alleyinteractive/action-test-general for more options - uses: alleyinteractive/action-test-general@develop - - - name: Run Node Tests - # See https://github.com/alleyinteractive/action-test-node for more options - uses: alleyinteractive/action-test-node@develop - - - name: Run PHP Tests - # See https://github.com/alleyinteractive/action-test-php for more options - uses: alleyinteractive/action-test-php@develop - with: - php-version: '${{ matrix.php }}' - wordpress-version: '${{ matrix.wordpress }}' - skip-wordpress-install: 'true' diff --git a/.github/workflows/build-branch.yml b/.github/workflows/build-branch.yml deleted file mode 100644 index 695a4c35..00000000 --- a/.github/workflows/build-branch.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Create a -built branch - -on: - push: - branches: - - main - - develop - -jobs: - built-branch: - uses: alleyinteractive/.github/.github/workflows/built-branch.yml@main - with: - node: 20 - php: 8.1 diff --git a/.github/workflows/built-release.yml b/.github/workflows/built-release.yml deleted file mode 100644 index 250160bd..00000000 --- a/.github/workflows/built-release.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Built Release - -on: - push: - branches: - - develop - -jobs: - built-release: - uses: alleyinteractive/.github/.github/workflows/built-release.yml@main - with: - node: 20 - php: 8.1 diff --git a/.github/workflows/dependabot-auto-approve.yml b/.github/workflows/dependabot-auto-approve.yml deleted file mode 100644 index e2119dec..00000000 --- a/.github/workflows/dependabot-auto-approve.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: dependabot-auto-approve -on: - pull_request: - -permissions: - pull-requests: write - contents: write - -jobs: - dependabot: - uses: alleyinteractive/.github/.github/workflows/dependabot-auto-approve.yml@main diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml deleted file mode 100644 index aaed13d4..00000000 --- a/.github/workflows/dependabot-auto-merge.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: dependabot-auto-merge -on: pull_request_target - -permissions: - pull-requests: write - contents: write - -jobs: - dependabot: - uses: alleyinteractive/.github/.github/workflows/dependabot-auto-merge.yml@main diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml deleted file mode 100644 index 0cdea233..00000000 --- a/.github/workflows/update-changelog.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: "Update Changelog" - -on: - release: - types: [released] - -jobs: - update: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - ref: main - - - name: Update Changelog - uses: stefanzweifel/changelog-updater-action@v1 - with: - latest-version: ${{ github.event.release.name }} - release-notes: ${{ github.event.release.body }} - - - name: Commit updated CHANGELOG - uses: stefanzweifel/git-auto-commit-action@v5 - with: - branch: main - commit_message: Update CHANGELOG - file_pattern: CHANGELOG.md diff --git a/.github/workflows/upgrade-wordpress-plugin.yml b/.github/workflows/upgrade-wordpress-plugin.yml deleted file mode 100644 index 2ede92a5..00000000 --- a/.github/workflows/upgrade-wordpress-plugin.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Update WordPress Plugin - -on: - schedule: - - cron: '0 6 1 * *' # Run on the first day of every month at 6am UTC. - -permissions: - contents: write - pull-requests: write - -jobs: - update-plugin: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: alleyinteractive/action-update-wordpress-plugin@v2.0.0 - with: - plugin-file: 'wp-curate.php' - upgrade-npm-dependencies: "true" diff --git a/.gitignore b/.gitignore index a8545793..56180bf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,22 @@ -# Build files -build -vendor -composer.lock -node_modules - -# Log files -*.log - -# Cache files -.phpcs/*.json -.phpunit.result.cache - -# Ignore temporary OS files .DS_Store -.DS_Store? -.Spotlight-V100 -.Trashes -ehthumbs.db Thumbs.db -.thumbsdb - -# IDE files -*.code-workspace -.idea -.vscode +wp-cli.local.yml +node_modules/ +*.sql +*.tar.gz +*.zip +.phpunit.result.cache +Dockerfile +output.log +.github +tests +bin +composer.lock +.phpcs.xml +phpunit.xml +configure.php +DOCKER_ENV +phpunit.xml +tests +.phpcs +Makefile diff --git a/.phpcs.xml b/.phpcs.xml deleted file mode 100644 index d57c51b5..00000000 --- a/.phpcs.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - PHP_CodeSniffer standard for wp-curate. - - - - - - - - - - - - - - - - - - - - - - - - - - - build/ - vendor/ - - - - - - - - - - - - - - - src/assets.php - blocks - build - entries - - - - src/assets.php - - - - - - tests/*Test.php - - - - - tests/*Test.php - - diff --git a/.phpcs/.gitkeep b/.phpcs/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/build/post-title/block.json b/build/post-title/block.json new file mode 100644 index 00000000..468dd13d --- /dev/null +++ b/build/post-title/block.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "wp-curate/post-title", + "version": "0.1.0", + "title": "Post Title", + "category": "theme", + "icon": "post", + "description": "Custom post title for WP Curate", + "textdomain": "wp-curate", + "editorScript": "file:index.js", + "style": "wp-block-post-title", + "usesContext": [ + "postId", + "query", + "pinnedPosts", + "customPostTitles" + ], + "attributes": { + "level": { + "type": "number", + "default": 3 + }, + "supportsLevel": { + "type": "boolean", + "default": true + } + }, + "render": "file:render.php", + "supports": { + "inserter": false + } +} \ No newline at end of file diff --git a/build/post-title/index.asset.php b/build/post-title/index.asset.php new file mode 100644 index 00000000..75bd2b33 --- /dev/null +++ b/build/post-title/index.asset.php @@ -0,0 +1 @@ + array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-i18n', 'wp-primitives'), 'version' => '9e715e0b92a78b6fc441'); diff --git a/build/post-title/index.js b/build/post-title/index.js new file mode 100644 index 00000000..bf78e132 --- /dev/null +++ b/build/post-title/index.js @@ -0,0 +1 @@ +!function(){"use strict";var e,t,o,r,l,s,i,n,p,a,u,c={251:function(e,t,o){var r=o(196),l=Symbol.for("react.element"),s=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,n=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function a(e,t,o){var r,s={},a=null,u=null;for(r in void 0!==o&&(a=""+o),void 0!==t.key&&(a=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!p.hasOwnProperty(r)&&(s[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===s[r]&&(s[r]=t[r]);return{$$typeof:l,type:e,key:a,ref:u,props:s,_owner:n.current}}t.Fragment=s,t.jsx=a,t.jsxs=a},893:function(e,t,o){e.exports=o(251)},196:function(e){e.exports=window.React}},d={};function w(e){var t=d[e];if(void 0!==t)return t.exports;var o=d[e]={exports:{}};return c[e](o,o.exports,w),o.exports}e=window.wp.blocks,t=window.wp.primitives,r=(0,(o=w(893)).jsx)(t.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,o.jsx)(t.Path,{d:"m4 5.5h2v6.5h1.5v-6.5h2v-1.5h-5.5zm16 10.5h-16v-1.5h16zm-7 4h-9v-1.5h9z"})}),l=window.wp.i18n,s=window.wp.blockEditor,i=window.wp.coreData,n=w(196),p=window.wp.components,a=window.wp.data,u=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"name":"wp-curate/post-title","version":"0.1.0","title":"Post Title","category":"theme","icon":"post","description":"Custom post title for WP Curate","textdomain":"wp-curate","editorScript":"file:index.ts","style":"wp-block-post-title","usesContext":["postId","query","pinnedPosts","customPostTitles"],"attributes":{"level":{"type":"number","default":3},"supportsLevel":{"type":"boolean","default":true}},"render":"file:render.php","supports":{"inserter":false}}'),(0,e.registerBlockType)(u,{icon:r,edit:function(e){let{clientId:t,attributes:r,context:u,setAttributes:c}=e;const d=(0,a.select)("core/block-editor").getBlockParentsByBlockName(t,"wp-curate/query")[0],{postId:w,pinnedPosts:h=[],query:{postType:v="post"},customPostTitles:f=[]}=u,{level:m=3,supportsLevel:b}=r,[_="",,y]=(0,i.useEntityProp)("postType",v,"title",w.toString()),x=h.includes(w),k=f.find((e=>e?.postId===w)),P=b&&0!==m?`h${m}`:"p",g=(0,s.useBlockProps)();(0,n.useEffect)((()=>{f.length&&k&&!x&&(0,a.dispatch)("core/block-editor").updateBlockAttributes(d,{customPostTitles:f.filter((e=>e?.postId!==w))})}),[x,w,f,k,c,d]);const I=e=>{if(k?.postId&&0===k?.title.length&&e===_)return void(0,a.dispatch)("core/block-editor").updateBlockAttributes(d,{customPostTitles:f.filter((e=>e?.postId!==w))});if(e===_||e===k?.title)return;let t=[...f];k?.postId?k.title=e:k?.postId||(t=[...f,{postId:w,title:e}]),(0,a.dispatch)("core/block-editor").updateBlockAttributes(d,{customPostTitles:t})};let T=(0,o.jsx)(P,{...g,dangerouslySetInnerHTML:{__html:y?.rendered}});var S;return x&&(T=(0,o.jsx)(s.PlainText,{tagName:P,placeholder:(0,l.__)("Enter a custom title"),value:null!==(S=k?.title)&&void 0!==S?S:_,onChange:e=>I(e.trim()),onBlur:()=>""===k?.title&&I(_),__experimentalVersion:2,...g})),(0,o.jsxs)(o.Fragment,{children:[T,b?(0,o.jsx)(s.InspectorControls,{children:(0,o.jsx)(p.PanelBody,{title:(0,l.__)("Setup","wp-curate"),initialOpen:!0,children:(0,o.jsx)(p.SelectControl,{label:(0,l.__)("Heading Level"),value:m.toString(),options:[{label:"p",value:"0"},{label:"h1",value:"1"},{label:"h2",value:"2"},{label:"h3",value:"3"},{label:"h4",value:"4"},{label:"h5",value:"5"},{label:"h6",value:"6"}],onChange:e=>{c({level:parseInt(e,10)})}})})}):null]})}})}(); \ No newline at end of file diff --git a/build/post-title/index.php b/build/post-title/index.php new file mode 100644 index 00000000..4153a286 --- /dev/null +++ b/build/post-title/index.php @@ -0,0 +1,17 @@ + $attributes The array of attributes for this block. + * @var string $content Rendered block output. ie. . + * @var WP_Block $block The instance of the WP_Block class that represents the block being rendered. + * + * @package wp-curate + */ + +$current_post_id = intval( $block->context['postId'] ); + +if ( empty( $current_post_id ) ) { + return; +} + +$custom_post_titles = ! empty( $block->context['customPostTitles'] ) ? $block->context['customPostTitles'] : []; +$post_title = get_the_title( $current_post_id ); +$post_link = get_the_permalink( $current_post_id ); +$level = is_int( $attributes['level'] ) ? intval( $attributes['level'] ) : 0; +$tag_name = 0 === $level ? 'p' : "h{$level}"; + +if ( empty( $post_title ) || empty( $post_link ) ) { + return; +} + +// Use custom post title, if available. +if ( 0 < count( $custom_post_titles ) ) { + foreach ( $custom_post_titles as $value ) { + if ( $value['postId'] === $current_post_id ) { + $post_title = $value['title']; + break; + } + } +} + +?> +<> + + + +> diff --git a/build/post/block.json b/build/post/block.json new file mode 100644 index 00000000..8389ea82 --- /dev/null +++ b/build/post/block.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "wp-curate/post", + "version": "0.1.0", + "title": "Post", + "category": "theme", + "icon": "admin-post", + "description": "Container block to allow setting a post inline", + "textdomain": "wp-curate", + "editorScript": "file:index.js", + "editorStyle": "file:index.css", + "style": [ + "file:style-index.css" + ], + "usesContext": [ + "postId", + "query", + "moveData" + ], + "render": "file:render.php", + "supports": { + "inserter": false + } +} \ No newline at end of file diff --git a/build/post/index.asset.php b/build/post/index.asset.php new file mode 100644 index 00000000..2c416643 --- /dev/null +++ b/build/post/index.asset.php @@ -0,0 +1 @@ + array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '851872d869f6a2bd0391'); diff --git a/build/post/index.css b/build/post/index.css new file mode 100644 index 00000000..006f11a1 --- /dev/null +++ b/build/post/index.css @@ -0,0 +1 @@ +.wp-curate-post-block{container-name:wp-curate-block;container-type:inline-size;padding:2px}.wp-curate-post-block--selected{outline:1px dashed #ccc;outline-offset:.5rem}.wp-curate-post-block--backfill .block-editor-inner-blocks{opacity:.5}.wp-curate-post-block__actions{align-items:center;display:flex;justify-content:space-between;margin-top:.5rem}.wp-curate-post-block__actions__post-picker{align-self:flex-end}.wp-curate-query-block--move .wp-block-post:hover{cursor:pointer}.wp-block-post:hover .curate-droppable:after{align-items:center;background:hsla(0,0%,100%,.8);border:2px dashed var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#333;content:"Click to move post here";display:flex;font-size:40px;font-weight:700;height:100%;justify-content:center;left:0;pointer-events:auto;position:absolute;text-align:center;top:0;width:100%;z-index:9999}.wp-curate-error:after{color:#cc1818;content:"";font-family:dashicons;font-size:2.5rem;position:absolute;right:0;top:0;z-index:2}@container wp-curate-block (width < 335px){.wp-curate-post-block__post-picker{width:100%}.components-button-group,.wp-curate-post-block__actions{display:flex;flex-direction:column;width:100%}.components-button-group button,.wp-curate-post-block__actions button{margin:0 0 .25rem!important;text-align:left;width:100%}} diff --git a/build/post/index.js b/build/post/index.js new file mode 100644 index 00000000..fe2f6570 --- /dev/null +++ b/build/post/index.js @@ -0,0 +1,42 @@ +!function(){var e={373:function(e){var t;self,t=()=>(()=>{var e={6484:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function s(){for(var e=[],t=0;t{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".alley-scripts-post-picker__post-list{display:flex;flex-wrap:wrap;float:left;height:calc(70vh - 200px);justify-content:flex-start;overflow-y:auto;padding:8px;width:100%}.alley-scripts-post-picker__post{border:1px solid #eee;height:auto;justify-content:center;margin:0 8px 8px 0;transition:background-color .2s ease-in-out;width:calc((100% - 40px)/3)}@media(min-width: 780px){.alley-scripts-post-picker__post{width:calc((100% - 40px)/5)}}.alley-scripts-post-picker__post:hover{background-color:#f0f0f0}.alley-scripts-post-picker__post.is-selected{background-color:#f0f0f0}.alley-scripts-post-picker__load-more{clear:both;float:left;text-align:center;width:100%}","",{version:3,sources:["webpack://./src/components/post-picker/post-list.scss"],names:[],mappings:"AAAA,sCACE,YAAA,CACA,cAAA,CACA,UAAA,CACA,yBAAA,CACA,0BAAA,CACA,eAAA,CACA,WAAA,CACA,UAAA,CAGF,iCACE,qBAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,2CAAA,CACA,2BAAA,CAGA,yBATF,iCAUI,2BAAA,CAAA,CAGF,uCACE,wBAAA,CAGF,6CACE,wBAAA,CAIJ,sCACE,UAAA,CACA,UAAA,CACA,iBAAA,CACA,UAAA",sourcesContent:[".alley-scripts-post-picker__post-list {\n display: flex;\n flex-wrap: wrap;\n float: left;\n height: calc(70vh - 200px);\n justify-content: flex-start;\n overflow-y: auto;\n padding: 8px;\n width: 100%;\n}\n\n.alley-scripts-post-picker__post {\n border: 1px solid #eee;\n height: auto;\n justify-content: center;\n margin: 0 8px 8px 0;\n transition: background-color 0.2s ease-in-out;\n width: calc((100% - 40px) / 3);\n\n\n @media (min-width: 780px) {\n width: calc((100% - 40px) / 5);\n }\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n &.is-selected {\n background-color: #f0f0f0;\n }\n}\n\n.alley-scripts-post-picker__load-more {\n clear: both;\n float: left;\n text-align: center;\n width: 100%;\n}\n"],sourceRoot:""}]);const a=i},9680:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".alley-scripts-post-picker__modal .components-modal__content{width:90vw}.alley-scripts-post-picker__buttons{clear:both;display:block;text-align:right;width:100%}.alley-scripts-post-picker__buttons button{margin:5px}","",{version:3,sources:["webpack://./src/components/post-picker/search-modal.scss"],names:[],mappings:"AACE,6DACE,UAAA,CAIJ,oCACE,UAAA,CACA,aAAA,CACA,gBAAA,CACA,UAAA,CAEA,2CACE,UAAA",sourcesContent:[".alley-scripts-post-picker__modal {\n .components-modal__content {\n width: 90vw;\n }\n}\n\n.alley-scripts-post-picker__buttons {\n clear: both;\n display: block;\n text-align: right;\n width: 100%;\n\n button {\n margin: 5px;\n }\n}\n"],sourceRoot:""}]);const a=i},3800:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".post-picker-notice{margin:0 0 .5rem 0}","",{version:3,sources:["webpack://./src/components/post-picker/style.scss"],names:[],mappings:"AAAA,oBACE,kBAAA",sourcesContent:[".post-picker-notice {\n margin: 0 0 0.5rem 0;\n}\n"],sourceRoot:""}]);const a=i},5500:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,'.edit-post-sidebar .autocomplete__component,.editor-styles-wrapper .autocomplete__component{margin-bottom:20px}.edit-post-sidebar .autocomplete-base-control,.editor-styles-wrapper .autocomplete-base-control{position:relative}.edit-post-sidebar .autocomplete-text-control__input,.editor-styles-wrapper .autocomplete-text-control__input{margin:0}.edit-post-sidebar .autocomplete__selection-list,.editor-styles-wrapper .autocomplete__selection-list{list-style-type:none;margin:0 0 6px;padding:0}.edit-post-sidebar .autocomplete__selection-list--item,.editor-styles-wrapper .autocomplete__selection-list--item{display:inline-block;list-style:none}.edit-post-sidebar .autocomplete__selection-list--item--button,.editor-styles-wrapper .autocomplete__selection-list--item--button{margin-bottom:4px;margin-right:3px}.edit-post-sidebar .autocomplete__selection-list--item--button::after,.editor-styles-wrapper .autocomplete__selection-list--item--button::after{content:"×";font-size:16px;line-height:20px;margin-left:5px}.edit-post-sidebar .autocomplete__dropdown,.editor-styles-wrapper .autocomplete__dropdown{background-color:#fff;border-color:rgba(0,0,0,0) #e2e4e7 #e2e4e7;border-radius:0 0 4px 4px;border-style:solid;border-width:0 1px 1px;left:0;max-height:0;overflow-y:hidden;position:absolute;top:calc(100% + 1px);visibility:hidden;width:100%;z-index:10}.edit-post-sidebar .autocomplete__dropdown--is-open,.editor-styles-wrapper .autocomplete__dropdown--is-open{box-shadow:0 3px 30px rgba(25,30,35,.1);max-height:225px;overflow-y:scroll;visibility:visible}.edit-post-sidebar .autocomplete__dropdown--notice,.editor-styles-wrapper .autocomplete__dropdown--notice{padding:15px}.edit-post-sidebar .autocomplete__dropdown--results,.editor-styles-wrapper .autocomplete__dropdown--results{list-style:none;margin:0;padding:0}.edit-post-sidebar .autocomplete__list--item,.editor-styles-wrapper .autocomplete__list--item{list-style:none}.edit-post-sidebar .autocomplete__list--item>button,.editor-styles-wrapper .autocomplete__list--item>button{background:rgba(0,0,0,0);border-color:#e2e4e7;border-style:solid;border-width:0 0 1px;height:100%;line-height:1.25;text-align:left;white-space:inherit;width:100%}.edit-post-sidebar .autocomplete__list--item:last-child>button,.editor-styles-wrapper .autocomplete__list--item:last-child>button{border-bottom:0}',"",{version:3,sources:["webpack://./src/components/selector/styles.scss"],names:[],mappings:"AAAA,4FAgBI,kBACE,CAAA,gGAMF,iBACE,CAAA,8GAMF,QACE,CAAA,sGAMF,oBACE,CAAA,cACA,CAAA,SACA,CAAA,kHAEA,oBACE,CAAA,eACA,CAAA,kIAEA,iBACE,CAAA,gBACA,CAAA,gJAEA,WACE,CAAA,cACA,CAAA,gBACA,CAAA,eACA,CAAA,0FASR,qBACE,CAAA,0CACA,CAAA,yBACA,CAAA,kBACA,CAAA,sBACA,CAAA,MACA,CAAA,YACA,CAAA,iBACA,CAAA,iBACA,CAAA,oBACA,CAAA,iBACA,CAAA,UACA,CAAA,UACA,CAAA,4GAGA,uCACE,CAAA,gBACA,CAAA,iBACA,CAAA,kBACA,CAAA,0GAIF,YACE,CAAA,4GAIF,eACE,CAAA,QACA,CAAA,SACA,CAAA,8FAOJ,eACE,CAAA,4GAEA,wBACE,CAAA,oBACA,CAAA,kBACA,CAAA,oBACA,CAAA,WACA,CAAA,gBACA,CAAA,eACA,CAAA,mBACA,CAAA,UACA,CAAA,kIAGF,eACE",sourcesContent:["//--------------------------------------------------------------\n// AutoComplete Styles\n//--------------------------------------------------------------\n\n/* stylelint-disable max-nesting-depth */\n\n//-----------------------------------------\n// Accommodate editor well, or the sidebar.\n//-----------------------------------------\n.edit-post-sidebar,\n.editor-styles-wrapper {\n .autocomplete {\n\n //-----------------------------------------\n // Parent form wrapper.\n //-----------------------------------------\n &__component {\n margin-bottom: 20px;\n }\n\n //-----------------------------------------\n // Wrapper\n //-----------------------------------------\n &-base-control {\n position: relative;\n }\n\n //-----------------------------------------\n // Input\n //-----------------------------------------\n &-text-control__input {\n margin: 0;\n }\n\n //-----------------------------------------\n // Selected buttons.\n //-----------------------------------------\n &__selection-list {\n list-style-type: none;\n margin: 0 0 6px;\n padding: 0;\n\n &--item {\n display: inline-block;\n list-style: none;\n\n &--button {\n margin-bottom: 4px;\n margin-right: 3px;\n\n &::after {\n content: '×';\n font-size: 16px;\n line-height: 20px;\n margin-left: 5px;\n }\n }\n }\n }\n\n //-----------------------------------------\n // Results\n //-----------------------------------------\n &__dropdown {\n background-color: #fff;\n border-color: transparent #e2e4e7 #e2e4e7;\n border-radius: 0 0 4px 4px;\n border-style: solid;\n border-width: 0 1px 1px;\n left: 0;\n max-height: 0;\n overflow-y: hidden;\n position: absolute;\n top: calc(100% + 1px); // Offset focus border.\n visibility: hidden;\n width: 100%;\n z-index: 10;\n\n // Container is open.\n &--is-open {\n box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1);\n max-height: 225px;\n overflow-y: scroll;\n visibility: visible;\n }\n\n // Notice handler.\n &--notice {\n padding: 15px;\n }\n\n // Results container.\n &--results {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n }\n\n //-----------------------------------------\n // List/Results\n //-----------------------------------------\n &__list--item {\n list-style: none;\n\n > button {\n background: transparent;\n border-color: #e2e4e7;\n border-style: solid;\n border-width: 0 0 1px;\n height: 100%;\n line-height: 1.25;\n text-align: left;\n white-space: inherit;\n width: 100%;\n }\n\n &:last-child > button {\n border-bottom: 0;\n }\n }\n }\n}\n"],sourceRoot:""}]);const a=i},1849:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var a=0;a0?" ".concat(u[5]):""," {").concat(u[1],"}")),u[5]=o),n&&(u[2]?(u[1]="@media ".concat(u[2]," {").concat(u[1],"}"),u[2]=n):u[2]=n),s&&(u[4]?(u[1]="@supports (".concat(u[4],") {").concat(u[1],"}"),u[4]=s):u[4]="".concat(s)),t.push(u))}},t}},2876:e=>{"use strict";e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var r=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),s="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),o="/*# ".concat(s," */");return[t].concat([o]).join("\n")}return[t].join("\n")}},6595:function(e){e.exports=function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:r,getOwnPropertyDescriptor:s}=Object;let{freeze:o,seal:i,create:a}=Object,{apply:l,construct:c}="undefined"!=typeof Reflect&&Reflect;o||(o=function(e){return e}),i||(i=function(e){return e}),l||(l=function(e,t,n){return e.apply(t,n)}),c||(c=function(e,t){return new e(...t)});const u=w(Array.prototype.forEach),d=w(Array.prototype.pop),p=w(Array.prototype.push),f=w(String.prototype.toLowerCase),h=w(String.prototype.toString),m=w(String.prototype.match),g=w(String.prototype.replace),y=w(String.prototype.indexOf),v=w(String.prototype.trim),b=w(RegExp.prototype.test),A=(_=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),s=1;s2&&void 0!==arguments[2]?arguments[2]:f;t&&t(e,null);let o=r.length;for(;o--;){let t=r[o];if("string"==typeof t){const e=s(t);e!==t&&(n(r)||(r[o]=e),t=e)}e[t]=!0}return e}function C(t){const n=a(null);for(const[r,o]of e(t))void 0!==s(t,r)&&(n[r]=o);return n}function S(e,t){for(;null!==e;){const n=s(e,t);if(n){if(n.get)return w(n.get);if("function"==typeof n.value)return w(n.value)}e=r(e)}return function(e){return console.warn("fallback value for",e),null}}const k=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),E=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),R=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),T=o(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),I=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),N=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),P=o(["#text"]),O=o(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),L=o(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),j=o(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),D=o(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),U=i(/\{\{[\w\W]*|[\w\W]*\}\}/gm),B=i(/<%[\w\W]*|[\w\W]*%>/gm),M=i(/\${[\w\W]*}/gm),F=i(/^data-[\-\w.\u00B7-\uFFFF]/),z=i(/^aria-[\-\w]+$/),q=i(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),$=i(/^(?:\w+script|data):/i),H=i(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),W=i(/^html$/i);var G=Object.freeze({__proto__:null,MUSTACHE_EXPR:U,ERB_EXPR:B,TMPLIT_EXPR:M,DATA_ATTR:F,ARIA_ATTR:z,IS_ALLOWED_URI:q,IS_SCRIPT_OR_DATA:$,ATTR_WHITESPACE:H,DOCTYPE_NAME:W});return function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"undefined"==typeof window?null:window;const r=e=>t(e);if(r.version="3.0.6",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;let{document:s}=n;const i=s,l=i.currentScript,{DocumentFragment:c,HTMLTemplateElement:_,Node:w,Element:U,NodeFilter:B,NamedNodeMap:M=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:F,DOMParser:z,trustedTypes:$}=n,H=U.prototype,Y=S(H,"cloneNode"),V=S(H,"nextSibling"),K=S(H,"childNodes"),Q=S(H,"parentNode");if("function"==typeof _){const e=s.createElement("template");e.content&&e.content.ownerDocument&&(s=e.content.ownerDocument)}let J,X="";const{implementation:Z,createNodeIterator:ee,createDocumentFragment:te,getElementsByTagName:ne}=s,{importNode:re}=i;let se={};r.isSupported="function"==typeof e&&"function"==typeof Q&&Z&&void 0!==Z.createHTMLDocument;const{MUSTACHE_EXPR:oe,ERB_EXPR:ie,TMPLIT_EXPR:ae,DATA_ATTR:le,ARIA_ATTR:ce,IS_SCRIPT_OR_DATA:ue,ATTR_WHITESPACE:de}=G;let{IS_ALLOWED_URI:pe}=G,fe=null;const he=x({},[...k,...E,...R,...I,...P]);let me=null;const ge=x({},[...O,...L,...j,...D]);let ye=Object.seal(a(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,be=null,Ae=!0,_e=!0,we=!1,xe=!0,Ce=!1,Se=!1,ke=!1,Ee=!1,Re=!1,Te=!1,Ie=!1,Ne=!0,Pe=!1,Oe=!0,Le=!1,je={},De=null;const Ue=x({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Be=null;const Me=x({},["audio","video","img","source","image","track"]);let Fe=null;const ze=x({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),qe="http://www.w3.org/1998/Math/MathML",$e="http://www.w3.org/2000/svg",He="http://www.w3.org/1999/xhtml";let We=He,Ge=!1,Ye=null;const Ve=x({},[qe,$e,He],h);let Ke=null;const Qe=["application/xhtml+xml","text/html"];let Je=null,Xe=null;const Ze=s.createElement("form"),et=function(e){return e instanceof RegExp||e instanceof Function},tt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!Xe||Xe!==e){if(e&&"object"==typeof e||(e={}),e=C(e),Ke=Ke=-1===Qe.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Je="application/xhtml+xml"===Ke?h:f,fe="ALLOWED_TAGS"in e?x({},e.ALLOWED_TAGS,Je):he,me="ALLOWED_ATTR"in e?x({},e.ALLOWED_ATTR,Je):ge,Ye="ALLOWED_NAMESPACES"in e?x({},e.ALLOWED_NAMESPACES,h):Ve,Fe="ADD_URI_SAFE_ATTR"in e?x(C(ze),e.ADD_URI_SAFE_ATTR,Je):ze,Be="ADD_DATA_URI_TAGS"in e?x(C(Me),e.ADD_DATA_URI_TAGS,Je):Me,De="FORBID_CONTENTS"in e?x({},e.FORBID_CONTENTS,Je):Ue,ve="FORBID_TAGS"in e?x({},e.FORBID_TAGS,Je):{},be="FORBID_ATTR"in e?x({},e.FORBID_ATTR,Je):{},je="USE_PROFILES"in e&&e.USE_PROFILES,Ae=!1!==e.ALLOW_ARIA_ATTR,_e=!1!==e.ALLOW_DATA_ATTR,we=e.ALLOW_UNKNOWN_PROTOCOLS||!1,xe=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ce=e.SAFE_FOR_TEMPLATES||!1,Se=e.WHOLE_DOCUMENT||!1,Re=e.RETURN_DOM||!1,Te=e.RETURN_DOM_FRAGMENT||!1,Ie=e.RETURN_TRUSTED_TYPE||!1,Ee=e.FORCE_BODY||!1,Ne=!1!==e.SANITIZE_DOM,Pe=e.SANITIZE_NAMED_PROPS||!1,Oe=!1!==e.KEEP_CONTENT,Le=e.IN_PLACE||!1,pe=e.ALLOWED_URI_REGEXP||q,We=e.NAMESPACE||He,ye=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&et(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ye.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&et(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ye.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ye.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ce&&(_e=!1),Te&&(Re=!0),je&&(fe=x({},[...P]),me=[],!0===je.html&&(x(fe,k),x(me,O)),!0===je.svg&&(x(fe,E),x(me,L),x(me,D)),!0===je.svgFilters&&(x(fe,R),x(me,L),x(me,D)),!0===je.mathMl&&(x(fe,I),x(me,j),x(me,D))),e.ADD_TAGS&&(fe===he&&(fe=C(fe)),x(fe,e.ADD_TAGS,Je)),e.ADD_ATTR&&(me===ge&&(me=C(me)),x(me,e.ADD_ATTR,Je)),e.ADD_URI_SAFE_ATTR&&x(Fe,e.ADD_URI_SAFE_ATTR,Je),e.FORBID_CONTENTS&&(De===Ue&&(De=C(De)),x(De,e.FORBID_CONTENTS,Je)),Oe&&(fe["#text"]=!0),Se&&x(fe,["html","head","body"]),fe.table&&(x(fe,["tbody"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');J=e.TRUSTED_TYPES_POLICY,X=J.createHTML("")}else void 0===J&&(J=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const r="data-tt-policy-suffix";t&&t.hasAttribute(r)&&(n=t.getAttribute(r));const s="dompurify"+(n?"#"+n:"");try{return e.createPolicy(s,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+s+" could not be created."),null}}($,l)),null!==J&&"string"==typeof X&&(X=J.createHTML(""));o&&o(e),Xe=e}},nt=x({},["mi","mo","mn","ms","mtext"]),rt=x({},["foreignobject","desc","title","annotation-xml"]),st=x({},["title","style","font","a","script"]),ot=x({},E);x(ot,R),x(ot,T);const it=x({},I);x(it,N);const at=function(e){p(r.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},lt=function(e,t){try{p(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!me[e])if(Re||Te)try{at(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ct=function(e){let t=null,n=null;if(Ee)e=""+e;else{const t=m(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ke&&We===He&&(e=''+e+"");const r=J?J.createHTML(e):e;if(We===He)try{t=(new z).parseFromString(r,Ke)}catch(e){}if(!t||!t.documentElement){t=Z.createDocument(We,"template",null);try{t.documentElement.innerHTML=Ge?X:r}catch(e){}}const o=t.body||t.documentElement;return e&&n&&o.insertBefore(s.createTextNode(n),o.childNodes[0]||null),We===He?ne.call(t,Se?"html":"body")[0]:Se?t.documentElement:o},ut=function(e){return ee.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT,null)},dt=function(e){return"function"==typeof w&&e instanceof w},pt=function(e,t,n){se[e]&&u(se[e],(e=>{e.call(r,t,n,Xe)}))},ft=function(e){let t=null;if(pt("beforeSanitizeElements",e,null),(n=e)instanceof F&&("string"!=typeof n.nodeName||"string"!=typeof n.textContent||"function"!=typeof n.removeChild||!(n.attributes instanceof M)||"function"!=typeof n.removeAttribute||"function"!=typeof n.setAttribute||"string"!=typeof n.namespaceURI||"function"!=typeof n.insertBefore||"function"!=typeof n.hasChildNodes))return at(e),!0;var n;const s=Je(e.nodeName);if(pt("uponSanitizeElement",e,{tagName:s,allowedTags:fe}),e.hasChildNodes()&&!dt(e.firstElementChild)&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return at(e),!0;if(!fe[s]||ve[s]){if(!ve[s]&&mt(s)){if(ye.tagNameCheck instanceof RegExp&&b(ye.tagNameCheck,s))return!1;if(ye.tagNameCheck instanceof Function&&ye.tagNameCheck(s))return!1}if(Oe&&!De[s]){const t=Q(e)||e.parentNode,n=K(e)||e.childNodes;if(n&&t)for(let r=n.length-1;r>=0;--r)t.insertBefore(Y(n[r],!0),V(e))}return at(e),!0}return e instanceof U&&!function(e){let t=Q(e);t&&t.tagName||(t={namespaceURI:We,tagName:"template"});const n=f(e.tagName),r=f(t.tagName);return!!Ye[e.namespaceURI]&&(e.namespaceURI===$e?t.namespaceURI===He?"svg"===n:t.namespaceURI===qe?"svg"===n&&("annotation-xml"===r||nt[r]):Boolean(ot[n]):e.namespaceURI===qe?t.namespaceURI===He?"math"===n:t.namespaceURI===$e?"math"===n&&rt[r]:Boolean(it[n]):e.namespaceURI===He?!(t.namespaceURI===$e&&!rt[r])&&!(t.namespaceURI===qe&&!nt[r])&&!it[n]&&(st[n]||!ot[n]):!("application/xhtml+xml"!==Ke||!Ye[e.namespaceURI]))}(e)?(at(e),!0):"noscript"!==s&&"noembed"!==s&&"noframes"!==s||!b(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ce&&3===e.nodeType&&(t=e.textContent,u([oe,ie,ae],(e=>{t=g(t,e," ")})),e.textContent!==t&&(p(r.removed,{element:e.cloneNode()}),e.textContent=t)),pt("afterSanitizeElements",e,null),!1):(at(e),!0)},ht=function(e,t,n){if(Ne&&("id"===t||"name"===t)&&(n in s||n in Ze))return!1;if(_e&&!be[t]&&b(le,t));else if(Ae&&b(ce,t));else if(!me[t]||be[t]){if(!(mt(e)&&(ye.tagNameCheck instanceof RegExp&&b(ye.tagNameCheck,e)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(e))&&(ye.attributeNameCheck instanceof RegExp&&b(ye.attributeNameCheck,t)||ye.attributeNameCheck instanceof Function&&ye.attributeNameCheck(t))||"is"===t&&ye.allowCustomizedBuiltInElements&&(ye.tagNameCheck instanceof RegExp&&b(ye.tagNameCheck,n)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))))return!1}else if(Fe[t]);else if(b(pe,g(n,de,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==y(n,"data:")||!Be[e])if(we&&!b(ue,g(n,de,"")));else if(n)return!1;return!0},mt=function(e){return e.indexOf("-")>0},gt=function(e){pt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:me};let s=t.length;for(;s--;){const o=t[s],{name:i,namespaceURI:a,value:l}=o,c=Je(i);let p="value"===i?l:v(l);if(n.attrName=c,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,pt("uponSanitizeAttribute",e,n),p=n.attrValue,n.forceKeepAttr)continue;if(lt(i,e),!n.keepAttr)continue;if(!xe&&b(/\/>/i,p)){lt(i,e);continue}Ce&&u([oe,ie,ae],(e=>{p=g(p,e," ")}));const f=Je(e.nodeName);if(ht(f,c,p)){if(!Pe||"id"!==c&&"name"!==c||(lt(i,e),p="user-content-"+p),J&&"object"==typeof $&&"function"==typeof $.getAttributeType)if(a);else switch($.getAttributeType(f,c)){case"TrustedHTML":p=J.createHTML(p);break;case"TrustedScriptURL":p=J.createScriptURL(p)}try{a?e.setAttributeNS(a,i,p):e.setAttribute(i,p),d(r.removed)}catch(e){}}}pt("afterSanitizeAttributes",e,null)},yt=function e(t){let n=null;const r=ut(t);for(pt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)pt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof c&&e(n.content),gt(n));pt("afterSanitizeShadowDOM",t,null)};return r.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,s=null,o=null,a=null;if(Ge=!e,Ge&&(e="\x3c!--\x3e"),"string"!=typeof e&&!dt(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!r.isSupported)return e;if(ke||tt(t),r.removed=[],"string"==typeof e&&(Le=!1),Le){if(e.nodeName){const t=Je(e.nodeName);if(!fe[t]||ve[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof w)n=ct("\x3c!----\x3e"),s=n.ownerDocument.importNode(e,!0),1===s.nodeType&&"BODY"===s.nodeName||"HTML"===s.nodeName?n=s:n.appendChild(s);else{if(!Re&&!Ce&&!Se&&-1===e.indexOf("<"))return J&&Ie?J.createHTML(e):e;if(n=ct(e),!n)return Re?null:Ie?X:""}n&&Ee&&at(n.firstChild);const l=ut(Le?e:n);for(;o=l.nextNode();)ft(o)||(o.content instanceof c&&yt(o.content),gt(o));if(Le)return e;if(Re){if(Te)for(a=te.call(n.ownerDocument);n.firstChild;)a.appendChild(n.firstChild);else a=n;return(me.shadowroot||me.shadowrootmode)&&(a=re.call(i,a,!0)),a}let d=Se?n.outerHTML:n.innerHTML;return Se&&fe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&b(W,n.ownerDocument.doctype.name)&&(d="\n"+d),Ce&&u([oe,ie,ae],(e=>{d=g(d,e," ")})),J&&Ie?J.createHTML(d):d},r.setConfig=function(){tt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),ke=!0},r.clearConfig=function(){Xe=null,ke=!1},r.isValidAttribute=function(e,t,n){Xe||tt({});const r=Je(e),s=Je(t);return ht(r,s,n)},r.addHook=function(e,t){"function"==typeof t&&(se[e]=se[e]||[],p(se[e],t))},r.removeHook=function(e){if(se[e])return d(se[e])},r.removeHooks=function(e){se[e]&&(se[e]=[])},r.removeAllHooks=function(){se={}},r}()}()},2232:function(e,t){var n,r;n=function e(){"use strict";var t="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t?t:{},n=!t.document&&!!t.postMessage,r=t.IS_PAPA_WORKER||!1,s={},o=0,i={parse:function(n,r){var a=(r=r||{}).dynamicTyping||!1;if(_(a)&&(r.dynamicTypingFunction=a,a={}),r.dynamicTyping=a,r.transform=!!_(r.transform)&&r.transform,r.worker&&i.WORKERS_SUPPORTED){var l=function(){if(!i.WORKERS_SUPPORTED)return!1;var n,r,a=(n=t.URL||t.webkitURL||null,r=e.toString(),i.BLOB_URL||(i.BLOB_URL=n.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ","(",r,")();"],{type:"text/javascript"})))),l=new t.Worker(a);return l.onmessage=g,l.id=o++,s[l.id]=l}();return l.userStep=r.step,l.userChunk=r.chunk,l.userComplete=r.complete,l.userError=r.error,r.step=_(r.step),r.chunk=_(r.chunk),r.complete=_(r.complete),r.error=_(r.error),delete r.worker,void l.postMessage({input:n,config:r,workerId:l.id})}var f=null;return i.NODE_STREAM_INPUT,"string"==typeof n?(n=function(e){return 65279===e.charCodeAt(0)?e.slice(1):e}(n),f=r.download?new c(r):new d(r)):!0===n.readable&&_(n.read)&&_(n.on)?f=new p(r):(t.File&&n instanceof File||n instanceof Object)&&(f=new u(r)),f.stream(n)},unparse:function(e,t){var n=!1,r=!0,s=",",o="\r\n",a='"',l=a+a,c=!1,u=null,d=!1;!function(){if("object"==typeof t){if("string"!=typeof t.delimiter||i.BAD_DELIMITERS.filter((function(e){return-1!==t.delimiter.indexOf(e)})).length||(s=t.delimiter),("boolean"==typeof t.quotes||"function"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes),"boolean"!=typeof t.skipEmptyLines&&"string"!=typeof t.skipEmptyLines||(c=t.skipEmptyLines),"string"==typeof t.newline&&(o=t.newline),"string"==typeof t.quoteChar&&(a=t.quoteChar),"boolean"==typeof t.header&&(r=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error("Option columns is empty");u=t.columns}void 0!==t.escapeChar&&(l=t.escapeChar+a),("boolean"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(d=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\-@\t\r].*$/)}}();var p=new RegExp(h(a),"g");if("string"==typeof e&&(e=JSON.parse(e)),Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return f(null,e,c);if("object"==typeof e[0])return f(u||Object.keys(e[0]),e,c)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||u),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:"object"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||"object"==typeof e.data[0]||(e.data=[e.data])),f(e.fields||[],e.data||[],c);throw new Error("Unable to serialize unrecognized input");function f(e,t,n){var i="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var a=Array.isArray(e)&&0=this._config.preview;if(r)t.postMessage({results:a,workerId:i.WORKER_ID,finished:c});else if(_(this._config.chunk)&&!n){if(this._config.chunk(a,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);a=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(a.data),this._completeResults.errors=this._completeResults.errors.concat(a.errors),this._completeResults.meta=a.meta),this._completed||!c||!_(this._config.complete)||a&&a.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),c||a&&a.meta.paused||this._nextChunk(),a}this._halted=!0},this._sendError=function(e){_(this._config.error)?this._config.error(e):r&&this._config.error&&t.postMessage({workerId:i.WORKER_ID,error:e,finished:!1})}}function c(e){var t;(e=e||{}).chunkSize||(e.chunkSize=i.RemoteChunkSize),l.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),n||(t.onload=A(this._chunkLoaded,this),t.onerror=A(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var r in e)t.setRequestHeader(r,e[r])}if(this._config.chunkSize){var s=this._start+this._config.chunkSize-1;t.setRequestHeader("Range","bytes="+this._start+"-"+s)}try{t.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===t.status&&this._chunkError()}},this._chunkLoaded=function(){4===t.readyState&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:t.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader("Content-Range");return null===t?-1:parseInt(t.substring(t.lastIndexOf("/")+1))}(t),this.parseChunk(t.responseText)))},this._chunkError=function(e){var n=t.statusText||e;this._sendError(new Error(n))}}function u(e){var t,n;(e=e||{}).chunkSize||(e.chunkSize=i.LocalChunkSize),l.call(this,e);var r="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,r?((t=new FileReader).onload=A(this._chunkLoaded,this),t.onerror=A(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function d(e){var t;l.call(this,e=e||{}),this.stream=function(e){return t=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,n=this._config.chunkSize;return n?(e=t.substring(0,n),t=t.substring(n)):(e=t,t=""),this._finished=!t,this.parseChunk(e)}}}function p(e){l.call(this,e=e||{});var t=[],n=!0,r=!1;this.pause=function(){l.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){l.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):n=!0},this._streamData=A((function(e){try{t.push("string"==typeof e?e:e.toString(this._config.encoding)),n&&(n=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}}),this),this._streamError=A((function(e){this._streamCleanUp(),this._sendError(e)}),this),this._streamEnd=A((function(){this._streamCleanUp(),r=!0,this._streamData("")}),this),this._streamCleanUp=A((function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)}),this)}function f(e){var t,n,r,s=Math.pow(2,53),o=-s,a=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,l=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,c=this,u=0,d=0,p=!1,f=!1,g=[],y={data:[],errors:[],meta:{}};if(_(e.step)){var v=e.step;e.step=function(t){if(y=t,x())w();else{if(w(),0===y.data.length)return;u+=t.data.length,e.preview&&u>e.preview?n.abort():(y.data=y.data[0],v(y,c))}}}function A(t){return"greedy"===e.skipEmptyLines?""===t.join("").trim():1===t.length&&0===t[0].length}function w(){return y&&r&&(S("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+i.DefaultDelimiter+"'"),r=!1),e.skipEmptyLines&&(y.data=y.data.filter((function(e){return!A(e)}))),x()&&function(){if(y)if(Array.isArray(y.data[0])){for(var t=0;x()&&t=g.length?"__parsed_extra":g[r]),e.transform&&(i=e.transform(i,o)),i=C(o,i),"__parsed_extra"===o?(s[o]=s[o]||[],s[o].push(i)):s[o]=i}return e.header&&(r>g.length?S("FieldMismatch","TooManyFields","Too many fields: expected "+g.length+" fields but parsed "+r,d+n):r=r.length/2?"\r\n":"\r"}(s,l)),r=!1,e.delimiter)_(e.delimiter)&&(e.delimiter=e.delimiter(s),y.meta.delimiter=e.delimiter);else{var c=function(t,n,r,s,o){var a,l,c,u;o=o||[",","\t","|",";",i.RECORD_SEP,i.UNIT_SEP];for(var d=0;d=a)return G(!0)}else for(M=u,u++;;){if(-1===(M=i.indexOf(t,M+1)))return f||w.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:A.length,index:u}),H();if(M===m-1)return H(i.substring(u,M).replace(B,t));if(t!==c||i[M+1]!==c){if(t===c||0===M||i[M-1]!==c){-1!==D&&D=a)return G(!0);break}w.push({type:"Quotes",code:"InvalidQuotes",message:"Trailing quote on quoted field is malformed",row:A.length,index:u}),M++}}else M++}return H();function q(e){A.push(e),C=u}function $(e){var t=0;if(-1!==e){var n=i.substring(M+1,e);n&&""===n.trim()&&(t=n.length)}return t}function H(e){return f||(void 0===e&&(e=i.substring(u)),x.push(e),u=m,q(x),b&&Y()),G()}function W(e){u=e,q(x),x=[],U=i.indexOf(r,u)}function G(e){return{data:A,errors:w,meta:{delimiter:n,linebreak:r,aborted:d,truncated:!!e,cursor:C+(p||0)}}}function Y(){o(G()),A=[],w=[]}},this.abort=function(){d=!0},this.getCharIndex=function(){return u}}function g(e){var t=e.data,n=s[t.workerId],r=!1;if(t.error)n.userError(t.error,t.file);else if(t.results&&t.results.data){var o={abort:function(){r=!0,y(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:v,resume:v};if(_(n.userStep)){for(var i=0;i{"use strict";var r=n(7200);function s(){}function o(){}o.resetWarningCache=s,e.exports=function(){function e(e,t,n,s,o,i){if(i!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:s};return n.PropTypes=n,n}},900:(e,t,n)=>{e.exports=n(7336)()},7200:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4108:(e,t,n)=>{"use strict";var r=n(1280),s=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,o={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:s,type:e,key:c,ref:u,props:o,_owner:a.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},7e3:(e,t,n)=>{"use strict";e.exports=n(4108)},3736:e=>{e.exports=function(e,t,n,r){var s=n?n.call(r,e,t):void 0;if(void 0!==s)return!!s;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var a=Object.prototype.hasOwnProperty.bind(t),l=0;l{"use strict";var t=[];function n(e){for(var n=-1,r=0;r{"use strict";var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},2940:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},9516:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7020:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var s=void 0!==n.layer;s&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,s&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var o=n.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},9296:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},3376:(e,t,n)=>{"use strict";n.d(t,{cp:()=>Ut});var r=function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n2||H(j)>3?"":" "}function Y(e,t){for(;--t&&F()&&!(j<48||j>102||j>57&&j<65||j>70&&j<97););return $(e,q()+(t<6&&32==z()&&32==F()))}function V(e){for(;F();)switch(j){case e:return L;case 34:case 39:34!==e&&39!==e&&V(j);break;case 40:41===e&&V(e);break;case 92:F()}return L}function K(e,t){for(;F()&&e+j!==57&&(e+j!==84||47!==z()););return"/*"+$(t,L-1)+"*"+b(47===e?e:F())}function Q(e){for(;!H(z());)F();return $(e,L)}function J(e,t){for(var n="",r=0;r6)switch(S(e,t+1)){case 109:if(45!==S(e,t+4))break;case 102:return x(e,/(.+:)(.+)-([^]+)/,"$1"+d+"$2-$3$1"+u+(108==S(e,t+3)?"$3":"$2-$3"))+e;case 115:return~C(e,"stretch")?Z(x(e,"stretch","fill-available"),t,n)+e:e}break;case 5152:case 5920:return x(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,(function(t,n,r,s,o,i,a){return c+n+":"+r+a+(s?c+n+"-span:"+(o?i:+i-+r)+a:"")+e}));case 4949:if(121===S(e,t+6))return x(e,":",":"+d)+e;break;case 6444:switch(S(e,45===S(e,14)?18:11)){case 120:return x(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+d+(45===S(e,14)?"inline-":"")+"box$3$1"+d+"$2$3$1"+c+"$2box$3")+e;case 100:return x(e,":",":"+c)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return x(e,"scroll-","scroll-snap-")+e}return e}function ee(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case h:return void(e.return=Z(e.value,e.length,n));case g:return J([B(e,{value:x(e.value,"@","@"+d)})],r);case f:if(e.length)return function(e,t){return e.map(t).join("")}(n=e.props,(function(t){switch(w(t,r=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":M(B(e,{props:[x(t,/:(read-\w+)/,":"+u+"$1")]})),M(B(e,{props:[t]})),A(e,{props:I(n,r)});break;case"::placeholder":M(B(e,{props:[x(t,/:(plac\w+)/,":"+d+"input-$1")]})),M(B(e,{props:[x(t,/:(plac\w+)/,":"+u+"$1")]})),M(B(e,{props:[x(t,/:(plac\w+)/,c+"input-$1")]})),M(B(e,{props:[t]})),A(e,{props:I(n,r)})}return""}))}}function te(e){return function(e){return D="",e}(ne("",null,null,null,[""],e=function(e){return N=P=1,O=E(D=e),L=0,[]}(e),0,[0],e))}function ne(e,t,n,r,s,o,i,a,l){for(var c=0,u=0,d=i,p=0,f=0,h=0,m=1,g=1,y=1,v=0,A="",_=s,w=o,k=r,R=A;g;)switch(h=v,v=F()){case 40:if(108!=h&&58==S(R,d-1)){-1!=C(R+=x(W(v),"&","&\f"),"&\f")&&(y=-1);break}case 34:case 39:case 91:R+=W(v);break;case 9:case 10:case 13:case 32:R+=G(h);break;case 92:R+=Y(q()-1,7);continue;case 47:switch(z()){case 42:case 47:T(se(K(F(),q()),t,n,l),l);break;default:R+="/"}break;case 123*m:a[c++]=E(R)*y;case 125*m:case 59:case 0:switch(v){case 0:case 125:g=0;case 59+u:-1==y&&(R=x(R,/\f/g,"")),f>0&&E(R)-d&&T(f>32?oe(R+";",r,n,d-1,l):oe(x(R," ","")+";",r,n,d-2,l),l);break;case 59:R+=";";default:if(T(k=re(R,t,n,c,u,s,a,A,_=[],w=[],d,o),o),123===v)if(0===u)ne(R,t,k,k,_,o,d,a,w);else switch(99===p&&110===S(R,3)?100:p){case 100:case 108:case 109:case 115:ne(e,k,k,r&&T(re(e,k,k,0,0,s,a,A,s,_=[],d,w),w),s,w,d,a,r?_:w);break;default:ne(R,k,k,k,[""],w,0,a,w)}}c=u=f=0,m=y=1,A=R="",d=i;break;case 58:d=1+E(R),f=h;default:if(m<1)if(123==v)--m;else if(125==v&&0==m++&&125==(j=L>0?S(D,--L):0,P--,10===j&&(P=1,N--),j))continue;switch(R+=b(v),v*m){case 38:y=u>0?1:(R+="\f",-1);break;case 44:a[c++]=(E(R)-1)*y,y=1;break;case 64:45===z()&&(R+=W(F())),p=z(),u=d=E(A=R+=Q(q())),v++;break;case 45:45===h&&2==E(R)&&(m=0)}}return o}function re(e,t,n,r,s,o,i,a,l,c,u,d){for(var p=s-1,h=0===s?o:[""],m=R(h),g=0,y=0,b=0;g0?h[A]+" "+w:x(w,/&\f/g,h[A])))&&(l[b++]=C);return U(e,t,n,0===s?f:a,l,c,u,d)}function se(e,t,n,r){return U(e,t,n,p,b(j),k(e,2,-2),0,r)}function oe(e,t,n,r,s){return U(e,t,n,h,k(e,0,r),k(e,r+1,-1),r,s)}const ie={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var ae="undefined"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",le="undefined"!=typeof window&&"HTMLElement"in window,ce=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY&&"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY),ue=(new Set,Object.freeze([])),de=Object.freeze({}),pe=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),fe=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,he=/(^-|-$)/g;function me(e){return e.replace(fe,"-").replace(he,"")}var ge=/(a)(d)/gi,ye=function(e){return String.fromCharCode(e+(e>25?39:97))};function ve(e){var t,n="";for(t=Math.abs(e);t>52;t=t/52|0)n=ye(t%52)+n;return(ye(t%52)+n).replace(ge,"$1-$2")}var be,Ae=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},_e=function(e){return Ae(5381,e)};function we(e){return"string"==typeof e&&!0}var xe="function"==typeof Symbol&&Symbol.for,Ce=xe?Symbol.for("react.memo"):60115,Se=xe?Symbol.for("react.forward_ref"):60112,ke={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Ee={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Re={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},Te=((be={})[Se]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},be[Ce]=Re,be);function Ie(e){return("type"in(t=e)&&t.type.$$typeof)===Ce?Re:"$$typeof"in e?Te[e.$$typeof]:ke;var t}var Ne=Object.defineProperty,Pe=Object.getOwnPropertyNames,Oe=Object.getOwnPropertySymbols,Le=Object.getOwnPropertyDescriptor,je=Object.getPrototypeOf,De=Object.prototype;function Ue(e,t,n){if("string"!=typeof t){if(De){var r=je(t);r&&r!==De&&Ue(e,r,n)}var s=Pe(t);Oe&&(s=s.concat(Oe(t)));for(var o=Ie(e),i=Ie(t),a=0;a0?" Args: ".concat(t.join(", ")):""))}var Ge=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}return e.prototype.indexOfGroup=function(e){for(var t=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,r=n.length,s=r;e>=s;)if((s<<=1)<0)throw We(16,"".concat(e));this.groupSizes=new Uint32Array(s),this.groupSizes.set(n),this.length=s;for(var o=r;o=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],r=this.indexOfGroup(e),s=r+n,o=r;o=0){var n=document.createTextNode(t);return this.element.insertBefore(n,this.nodes[e]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},e.prototype.getRule=function(e){return e0&&(l+="".concat(e,","))})),r+="".concat(i).concat(a,'{content:"').concat(l,'"}').concat("/*!sc*/\n")},o=0;o0?".".concat(t):e},u=l.slice();u.push((function(e){e.type===f&&e.value.includes("&")&&(e.props[0]=e.props[0].replace(ut,n).replace(r,c))})),i.prefix&&u.push(ee),u.push(X);var d=function(e,s,o,a){void 0===s&&(s=""),void 0===o&&(o=""),void 0===a&&(a="&"),t=a,n=s,r=new RegExp("\\".concat(n,"\\b"),"g");var l=e.replace(dt,""),c=te(o||s?"".concat(o," ").concat(s," { ").concat(l," }"):l);i.namespace&&(c=pt(c,i.namespace));var d,p,f,h=[];return J(c,(d=u.concat((f=function(e){return h.push(e)},function(e){e.root||(e=e.return)&&f(e)})),p=R(d),function(e,t,n,r){for(var s="",o=0;o="A"&&e<="Z"};function wt(e){for(var t="",n=0;n>>0);if(!t.hasNameForId(this.componentId,o)){var i=n(s,".".concat(o),void 0,this.componentId);t.insertRules(this.componentId,o,i)}r=Fe(r,o),this.staticRulesId=o}else{for(var a=Ae(this.baseHash,n.hash),l="",c=0;c>>0);t.hasNameForId(this.componentId,p)||t.insertRules(this.componentId,p,n(l,".".concat(p),void 0,this.componentId)),r=Fe(r,p)}}return r},e}(),Tt=i().createContext(void 0);Tt.Consumer;var It={};function Nt(e,t,n){var s=Me(e),a=e,l=!we(e),c=t.attrs,u=void 0===c?ue:c,d=t.componentId,p=void 0===d?function(e,t){var n="string"!=typeof e?"sc":me(e);It[n]=(It[n]||0)+1;var r="".concat(n,"-").concat(function(e){return ve(_e(e)>>>0)}("6.1.1"+n+It[n]));return t?"".concat(t,"-").concat(r):r}(t.displayName,t.parentComponentId):d,f=t.displayName,h=void 0===f?function(e){return we(e)?"styled.".concat(e):"Styled(".concat(function(e){return e.displayName||e.name||"Component"}(e),")")}(e):f,m=t.displayName&&t.componentId?"".concat(me(t.displayName),"-").concat(t.componentId):t.componentId||p,g=s&&a.attrs?a.attrs.concat(u).filter(Boolean):u,y=t.shouldForwardProp;if(s&&a.shouldForwardProp){var v=a.shouldForwardProp;if(t.shouldForwardProp){var b=t.shouldForwardProp;y=function(e,t){return v(e,t)&&b(e,t)}}else y=v}var A=new Rt(n,m,s?a.componentStyle:void 0);function _(e,t){return function(e,t,n){var s=e.attrs,a=e.componentStyle,l=e.defaultProps,c=e.foldedComponentIds,u=e.styledComponentId,d=e.target,p=i().useContext(Tt),f=vt(),h=e.shouldForwardProp||f.shouldForwardProp,m=function(e,t,n){for(var s,o=r(r({},t),{className:void 0,theme:n}),i=0;i2&&ct.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,r)}}(),function(){function e(){var e=this;this._emitSheetCSS=function(){var t=e.instance.toString(),n=nt(),r=ze([n&&'nonce="'.concat(n,'"'),"".concat(ae,'="true"'),"".concat("data-styled-version",'="').concat("6.1.1",'"')].filter(Boolean)," ");return"")},this.getStyleTags=function(){if(e.sealed)throw We(2);return e._emitSheetCSS()},this.getStyleElement=function(){var t;if(e.sealed)throw We(2);var n=((t={})[ae]="",t["data-styled-version"]="6.1.1",t.dangerouslySetInnerHTML={__html:e.instance.toString()},t),s=nt();return s&&(n.nonce=s),[i().createElement("style",r({},n,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new ct({isServer:!0}),this.sealed=!1}e.prototype.collectStyles=function(e){if(this.sealed)throw We(2);return i().createElement(bt,{sheet:this.instance},e)},e.prototype.interleaveWithNodeStream=function(e){throw We(3)}}(),"__sc-".concat(ae,"__")},4928:(e,t,n)=>{"use strict";n.d(t,{default:()=>d});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(7720);const l=i.cp.div` + height: auto; + width: 100%; +`,c=({src:e})=>(0,r.jsx)(l,{children:(0,r.jsx)("audio",{className:"edit-audio-preview",controls:!0,src:e})});c.propTypes={src:o().string.isRequired};const u=({className:e,onReset:t,onUpdate:n,onUpdateURL:s,value:o,valueURL:i})=>(0,r.jsx)(a.MediaPicker,{allowedTypes:["audio"],className:e,icon:"format-audio",onReset:t,onUpdate:n,onUpdateURL:s,preview:c,value:o,valueURL:i});u.defaultProps={className:"",onUpdateURL:null,valueURL:""},u.propTypes={className:o().string,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,value:o().number.isRequired,valueURL:o().string};const d=u},2312:(e,t,n)=>{"use strict";n.d(t,{default:()=>l});var r=n(7e3),s=n(900),o=n.n(s),i=n(7287);const a=({label:e,value:t,options:n,onChange:s})=>(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.BaseControl,{label:e}),n.map((e=>(0,r.jsx)(i.CheckboxControl,{label:e.label,checked:t.includes(e.value),onChange:n=>{s(n?[...t,e.value]:[...t.filter((t=>t!==e.value))])}})))]});a.propTypes={label:o().string.isRequired,value:o().arrayOf(o().string).isRequired,options:o().arrayOf(o().shape({label:o().string.isRequired,value:o().string.isRequired})).isRequired,onChange:o().func.isRequired};const l=a},8312:(e,t,n)=>{"use strict";n.d(t,{default:()=>u});var r=n(7e3),s=n(1280),o=n.n(s),i=n(3396),a=n(900),l=n.n(a),c=n(5328);class u extends o().PureComponent{static handleSubmit(e){e.preventDefault()}constructor(e){super(e),this.handleChange=this.handleChange.bind(this),this.state={error:"",success:""}}handleChange(e){const{attributeName:t,callback:n,setAttributes:r}=this.props;e.target.files&&e.target.files[0]&&(0,c.parseCSVFile)(e.target.files[0]).then((e=>n?n(e):e)).then((e=>{Array.isArray(e)&&e.length>0?(this.setState({error:"",success:(0,i.__)("Successfully read CSV data.","alley-scripts")}),r({[t]:JSON.stringify(e)})):this.setState({error:(0,i.__)("Could not map CSV data. Please check the source file to ensure that it has the correct structure.","alley-scripts"),success:""})})).catch((e=>{this.setState({error:e,success:""})}))}render(){const{error:e="",success:t=""}=this.state;return(0,r.jsxs)("div",{className:"alley-scripts-block-csv-uploader",children:[(0,r.jsx)("h2",{children:(0,i.__)("Upload CSV","alley-scripts")}),(0,r.jsxs)("form",{onSubmit:this.handleSubmit,children:[""!==e?(0,r.jsxs)("div",{style:{color:"#c00"},children:[(0,r.jsx)("strong",{children:(0,i.__)("Error:","alley-scripts")})," ",e]}):null,""!==t?(0,r.jsxs)("div",{style:{color:"#0c0"},children:[(0,r.jsx)("strong",{children:(0,i.__)("Success:","alley-scripts")})," ",t]}):null,(0,r.jsx)("div",{children:(0,r.jsxs)("label",{htmlFor:"alley-scripts-block-csv-uploader-file",children:[(0,r.jsx)("p",{children:(0,i.__)("Select a file to load data.","alley-scripts")}),(0,r.jsx)("input",{id:"alley-scripts-block-csv-uploader-file",onChange:this.handleChange,type:"file"})]})})]})]})}}u.defaultProps={callback:null},u.propTypes={attributeName:l().string.isRequired,callback:l().func,setAttributes:l().func.isRequired}},8348:(e,t,n)=>{"use strict";n.d(t,{default:()=>p});var r=n(7e3),s=n(3396),o=n(900),i=n.n(o),a=n(3376),l=n(7720);const c=a.cp.div` + box-sizing: border-box; + flex-shrink: 0; + height: auto; + max-height: 1450px; + max-width: 1450px; + min-height: 20px; + min-width: 20px; + position: relative; + width: auto; +`,u=({src:e})=>(0,r.jsx)(c,{children:(0,r.jsx)("img",{alt:(0,s.__)("Edit image","alley-scripts"),className:"edit-image-preview",src:e,title:(0,s.__)("Edit image","alley-scripts")})});u.propTypes={src:i().string.isRequired};const d=({className:e,imageSize:t,displayControlsInToolbar:n,onReset:s,onUpdate:o,onUpdateURL:i,value:a,valueURL:c})=>(0,r.jsx)(l.MediaPicker,{allowedTypes:["image"],className:e,icon:"format-image",imageSize:t,displayControlsInToolbar:n,onReset:s,onUpdate:o,onUpdateURL:i,preview:u,value:a,valueURL:c});d.defaultProps={className:"",imageSize:"thumbnail",displayControlsInToolbar:!1,onUpdateURL:null,valueURL:""},d.propTypes={className:i().string,imageSize:i().string,displayControlsInToolbar:i().bool,onReset:i().func.isRequired,onUpdate:i().func.isRequired,onUpdateURL:i().func,value:i().number.isRequired,valueURL:i().string};const p=d},7720:(e,t,n)=>{"use strict";n.d(t,{AudioPicker:()=>r.default,CSVUploader:()=>o.default,Checkboxes:()=>s.default,ImagePicker:()=>i.default,MediaPicker:()=>a.default,PostPicker:()=>c.default,PostSelector:()=>u.default,SafeHtml:()=>l.default,Selector:()=>d.default,Sortable:()=>p.default,SortableItem:()=>f.default,TermSelector:()=>h.default,VideoPicker:()=>m.default});var r=n(4928),s=n(2312),o=n(8312),i=n(8348),a=n(5680),l=n(9160),c=n(4808),u=n(8800),d=n(9064),p=n(8504),f=n(1917),h=n(668),m=n(5316)},5680:(e,t,n)=>{"use strict";n.d(t,{default:()=>m});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(9528),l=n(7287),c=n(7752),u=n(3396),d=n(5328);const p=i.cp.div` + display: block; + position: relative; +`,f=i.cp.div` + background: white; + border: 1px solid black; + padding: 1em; +`,h=({allowedTypes:e,className:t,icon:n,imageSize:s,displayControlsInToolbar:o,onReset:i,onUpdate:h,onUpdateURL:m,preview:g,value:y,valueURL:v})=>{const{media:b}=(0,c.useSelect)((e=>({media:y?e("core").getMedia(y):void 0})),[y]);if(0!==y&&null===b)return(0,r.jsx)(l.Spinner,{});const A=b?(0,d.getMediaUrl)(b,s):v;return A?(0,r.jsxs)(p,{className:t,children:[g?(0,r.jsx)(g,{src:A}):(0,r.jsxs)(f,{className:"alley-scripts-media-picker__preview",children:[(0,r.jsx)("p",{children:(0,u.__)("Selected file:","alley-scripts")}),(0,r.jsx)("p",{children:(0,r.jsx)("a",{href:A,children:A})})]}),o?(0,r.jsx)(a.BlockControls,{group:"other",children:(0,r.jsx)(a.MediaReplaceFlow,{name:(0,u.__)("Edit Media","alley-scripts"),mediaId:y,mediaURL:A,allowedTypes:e,onSelect:h,onSelectURL:m,children:(0,r.jsx)(l.ToolbarButton,{isDestructive:!0,text:(0,u.__)("Remove","alley-scripts"),onClick:i})})}):(0,r.jsx)(l.Button,{variant:"primary",onClick:i,children:(0,u.__)("Reset","alley-scripts")})]}):(0,r.jsx)(p,{className:t,children:(0,r.jsx)(a.MediaPlaceholder,{allowedTypes:e,disableMediaButtons:!!v,icon:(0,r.jsx)(a.BlockIcon,{icon:n}),onSelect:h,onSelectURL:m,value:{id:y,src:A}})})};h.defaultProps={allowedTypes:[],className:"",icon:"format-aside",imageSize:"thumbnail",displayControlsInToolbar:!1,onUpdateURL:null,preview:null,valueURL:""},h.propTypes={allowedTypes:o().arrayOf(o().string),className:o().string,icon:o().string,imageSize:o().string,displayControlsInToolbar:o().bool,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,preview:o().element,value:o().number.isRequired,valueURL:o().string};const m=h},4808:(e,t,n)=>{"use strict";n.d(t,{default:()=>F});var r=n(7e3),s=n(1280),o=n(3376),i=n(7287),a=n(3396),l=n(7204),c=n(2e3),u=n(2108),d=n.n(u),p=n(7020),f=n.n(p),h=n(7240),m=n.n(h),g=n(9516),y=n.n(g),v=n(2940),b=n.n(v),A=n(9296),_=n.n(A),w=n(9680),x={};x.styleTagTransform=_(),x.setAttributes=y(),x.insert=m().bind(null,"head"),x.domAPI=f(),x.insertStyleElement=b(),d()(w.c,x),w.c&&w.c.locals&&w.c.locals;var C=n(4632),S=n.n(C),k=n(6484),E=n.n(k),R=n(7424),T={};T.styleTagTransform=_(),T.setAttributes=y(),T.insert=m().bind(null,"head"),T.domAPI=f(),T.insertStyleElement=b(),d()(R.c,T),R.c&&R.c.locals&&R.c.locals;const I=window.wp.htmlEntities;var N=n(9160);const P=o.cp.div` + align-items: center; + gap: 4px; + overflow-wrap: anywhere; + display: flex; + flex-direction: column; + justify-content: center; + padding: 0.5rem 0.75rem; +`,O=({title:e,postType:t,attachmentID:n})=>{const s=(0,c.useMedia)(n),o=s?.media_details?.sizes?.thumbnail?.source_url,i=s?.alt_text??"";return(0,r.jsxs)(P,{children:[o?(0,r.jsx)("img",{style:{maxWidth:"100%",height:"auto"},loading:"lazy",src:o,alt:i}):null,(0,r.jsx)(N.default,{html:(0,I.decodeEntities)(e),className:"post-picker-result-title",tag:"strong"}),(0,a.sprintf)(" (%s)",t)]})},L=({baseUrl:e,searchRender:t,selected:n,setSelected:o,suppressPostIds:c=[]})=>{const[u,d]=(0,s.useState)(!1),[p,f]=(0,s.useState)([]),[h,m]=(0,s.useState)(!1),[g,y]=(0,s.useState)(0),[v,b]=(0,s.useState)({searchValue:"",page:1}),A=(0,s.useCallback)((async(t,n=!1)=>{if(t.searchValue&&t.searchValue.length<=2)return;const r=function(){let n=(0,l.addQueryArgs)(e,{page:t.page,_embed:1,exclude:c.join(",")});return t.searchValue&&t.searchValue.length>2&&(n=(0,l.addQueryArgs)(n,{search:t.searchValue})),n}();d(!0);const s=await S()({path:r,parse:!1});y(parseInt(s.headers.get("X-WP-TotalPages"),10));const o=await s.json();let i=o;t.page>1&&(i=[...p,...o]),n||(f(i),d(!1))}),[p,e,c]);return(0,s.useEffect)((()=>{let e=!1;return h||(m(!0),A(v,e)),()=>{e=!0}}),[A,h,v]),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.TextControl,{value:v.searchValue,placeholder:(0,a.__)("Search...","alley-scripts"),label:(0,a.__)("Search","alley-scripts"),onChange:e=>{const t={...v,searchValue:e,page:1};b(t),A(t)}}),(0,r.jsxs)("div",{className:"alley-scripts-post-picker__post-list",children:[p?p.map((e=>(0,r.jsx)(i.Button,{className:E()({"alley-scripts-post-picker__post":!0,"is-selected":e.id===n}),onClick:()=>o(e.id),children:t?t(e):(0,r.jsx)(O,{title:e.title,postType:e.subtype,attachmentID:e?._embedded?.self[0]?.featured_media})},e.id))):null,u?(0,r.jsx)(i.Spinner,{}):null,g>0&&v.page{const e={...v,page:v.page+1};b(e),A(e)},children:(0,a.__)("Load More","alley-scripts")})}):null]})]})},j=({baseUrl:e,closeModal:t,modalTitle:n,onUpdate:o,searchRender:l,suppressPostIds:c=[]})=>{const[u,d]=(0,s.useState)();return(0,r.jsxs)(i.Modal,{className:"alley-scripts-post-picker__modal",isDismissible:!0,title:n,onRequestClose:t,closeButtonLabel:"Close",children:[(0,r.jsx)(L,{baseUrl:e,selected:u??0,setSelected:d,searchRender:l,suppressPostIds:c}),(0,r.jsxs)("div",{className:"alley-scripts-post-picker__buttons",children:[(0,r.jsx)(i.Button,{variant:"secondary",onClick:t,children:(0,a.__)("Cancel","alley-scripts")}),(0,r.jsx)(i.Button,{variant:"primary",onClick:()=>{u&&(o(u),t())},disabled:!u,children:(0,a.__)("Select","alley-scripts")})]})]})};var D=n(3800),U={};U.styleTagTransform=_(),U.setAttributes=y(),U.insert=m().bind(null,"head"),U.domAPI=f(),U.insertStyleElement=b(),d()(D.c,U),D.c&&D.c.locals&&D.c.locals;const B=o.cp.div` + display: block; + position: relative; +`,M=o.cp.div` + border: 1px solid #eee; + display: flex; + flex-direction: column; + margin: 5px 0; + padding: 0.5rem 0.75rem; + text-align: center; +`,F=({allowedTypes:e,className:t,getPostType:n,modalTitle:o=(0,a.__)("Select Post","alley-scripts"),onReset:u,onUpdate:d,params:p={},previewLookup:f,previewRender:h,replaceText:m=(0,a.__)("Replace","alley-scripts"),resetText:g=(0,a.__)("Reset","alley-scripts"),searchEndpoint:y="/wp/v2/search",searchRender:v,selectText:b=(0,a.__)("Select","alley-scripts"),suppressPostIds:A=[],title:_="",value:w=0})=>{const[x,C]=(0,s.useState)(!1),S=(0,l.addQueryArgs)(y,{type:"post",subtype:e??"any",...p}),k=f?f(w):(0,c.usePostById)(w,n),{featured_media:E,title:{rendered:R=""}={},type:T=""}=k||{},I=()=>{C(!0)},N=()=>(0,r.jsxs)(i.ButtonGroup,{children:[(0,r.jsx)(i.Button,{variant:"secondary",onClick:u,style:{margin:"0 4px"},children:g}),(0,r.jsx)(i.Button,{variant:"secondary",onClick:I,style:{margin:"0 4px"},children:m})]});return 0!==w&&null===k?(0,r.jsx)(i.Spinner,{}):(0,r.jsxs)(B,{className:t,children:[_?(0,r.jsx)("h4",{children:_}):null,0!==w&&void 0===k?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.Notice,{status:"error",isDismissible:!1,className:"post-picker-notice",children:(0,r.jsx)("p",{children:(0,a.sprintf)((0,a.__)("Post %d is no longer available; it has been unpublished or deleted","alley-scripts"),w)})}),N()]}):null,0!==w&&void 0!==k?(0,r.jsxs)(r.Fragment,{children:[void 0!==h?h(k):(0,r.jsx)(M,{children:(0,r.jsx)(O,{title:R,postType:T,attachmentID:E})}),N()]}):null,0===w?(0,r.jsx)(i.Button,{onClick:I,variant:"secondary",children:b}):null,x?(0,r.jsx)(j,{closeModal:()=>{C(!1)},baseUrl:S,modalTitle:o,onUpdate:d,searchRender:v,suppressPostIds:A}):null]})}},8800:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(900),o=n.n(s),i=n(3396),a=n(7720);const l=({className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d})=>(0,r.jsx)(a.Selector,{type:"post",className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d});l.defaultProps={className:"",emptyLabel:(0,i.__)("No posts found","alley-scripts"),label:(0,i.__)("Search for posts","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,i.__)("Search for posts","alley-scripts"),subTypes:[],selected:[],threshold:3},l.propTypes={className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const c=l},9160:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(6595),o=n.n(s),i=n(900),a=n.n(i);const l=({className:e,html:t,tag:n})=>(0,r.jsx)(n,{className:e,dangerouslySetInnerHTML:{__html:o().sanitize(t)}});l.defaultProps={className:""},l.propTypes={className:a().string,html:a().string.isRequired,tag:a().string.isRequired};const c=l},9064:(e,t,n)=>{"use strict";n.d(t,{default:()=>B});var r=n(7e3),s=n(900),o=n.n(s),i=n(1280),a=n(4632),l=n.n(a),c=n(6484),u=n.n(c),d=n(7287),p=n(3396),f=n(7204);const h={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let m;const g=new Uint8Array(16);function y(){if(!m&&(m="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!m))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(g)}const v=[];for(let e=0;e<256;++e)v.push((e+256).toString(16).slice(1));const b=function(e,t,n){if(h.randomUUID&&!t&&!e)return h.randomUUID();const r=(e=e||{}).random||(e.rng||y)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return function(e,t=0){return v[e[t+0]]+v[e[t+1]]+v[e[t+2]]+v[e[t+3]]+"-"+v[e[t+4]]+v[e[t+5]]+"-"+v[e[t+6]]+v[e[t+7]]+"-"+v[e[t+8]]+v[e[t+9]]+"-"+v[e[t+10]]+v[e[t+11]]+v[e[t+12]]+v[e[t+13]]+v[e[t+14]]+v[e[t+15]]}(r)};var A=n(2e3);const _=({emptyLabel:e,error:t,id:n,isOpen:s,labelledbyId:o,loading:i,onSelect:a,options:l,selectedItems:c,threshold:f,value:h})=>{if(!i&&(""===h||f>h.length))return null;let m="",g="";return i?(m="loading",g=(0,p.__)("Loading...","alley-scripts")):t?(m="error",g=t):i||0!==l.length||(m="no-posts",g=e),i||!i&&(h&&0===l.length||t)?(0,r.jsx)("div",{"aria-busy":!0,className:u()("autocomplete__dropdown",{"autocomplete__dropdown--is-open":s}),children:(0,r.jsx)("div",{className:u()("autocomplete__dropdown--notice",`autocomplete__${m}`),children:g})}):(0,r.jsx)("div",{className:u()("autocomplete__dropdown",{"autocomplete__dropdown--is-open":s}),children:(0,r.jsx)("ul",{role:"listbox","aria-labelledby":o,id:n,className:u()("autocomplete__dropdown--results","autocomplete__list"),children:l.map((e=>(0,r.jsx)("li",{className:"autocomplete__list--item",children:(0,r.jsx)(d.Button,{onClick:()=>a(e),type:"button",disabled:c.some((t=>t.id===e.id)),isTertiary:!0,children:e.title})},e.id)))})})};_.propTypes={emptyLabel:o().string.isRequired,error:o().string.isRequired,id:o().string.isRequired,isOpen:o().bool.isRequired,labelledbyId:o().string.isRequired,loading:o().bool.isRequired,options:o().arrayOf(o().shape({label:o().string,value:o().string})).isRequired,onSelect:o().func.isRequired,selectedItems:o().shape([]).isRequired,threshold:o().number.isRequired,value:o().string.isRequired};const w=_;var x=n(2108),C=n.n(x),S=n(7020),k=n.n(S),E=n(7240),R=n.n(E),T=n(9516),I=n.n(T),N=n(2940),P=n.n(N),O=n(9296),L=n.n(O),j=n(5500),D={};D.styleTagTransform=L(),D.setAttributes=I(),D.insert=R().bind(null,"head"),D.domAPI=k(),D.insertStyleElement=P(),C()(j.c,D),j.c&&j.c.locals&&j.c.locals;const U=({type:e,className:t,emptyLabel:n,label:s,maxPages:o,multiple:a,onSelect:c,placeholder:p,subTypes:h,selected:m,threshold:g})=>{const y=b(),[v,_]=(0,i.useState)(""),[x,C]=(0,i.useState)([]),[S,k]=(0,i.useState)(!1),[E,R]=(0,i.useState)(!1),[T,I]=(0,i.useState)(""),[N,P]=(0,i.useState)([]),O=(0,i.useRef)(),L=(0,A.useDebounce)(T,750),j=(0,i.useCallback)((async(t=1)=>{if(L.length0?h.join(","):"any",type:e});await l()({path:r,parse:!1}).then((e=>{const t=parseInt(e.headers.get("X-WP-TotalPages"),10);return n=t>o?o:t,e.json()})).then((e=>{C((t=>[...t,...e])),R(!1),(n&&n>t||t>=1&&a&&N.length>0)&&j(t+1)})).catch((e=>_(e.message)))}),[L,e,o,a,h,N.length,g]);(0,i.useEffect)((()=>{P(m)}),[m]),(0,i.useEffect)((()=>{L&&g<=L.length?j():C([])}),[L,j,g]);const D=e=>{k(O.current.contains(e.target))},U=e=>{"Escape"===e.key&&k(!1)};(0,i.useEffect)((()=>(document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)))),(0,i.useEffect)((()=>(O&&document.addEventListener("mousedown",D),()=>document.removeEventListener("mousedown",D))));const B=e=>{let t=[];if(N.some((t=>t.id===e.id))){const n=N.findIndex((t=>t.id===e.id));t=[...N.slice(0,n),...N.slice(n+1,N.length)]}else a?t=[...N,e]:(t=[e],k(!1));P(t),c(t)};return(0,r.jsx)("form",{className:"autocomplete__component",onSubmit:e=>e.preventDefault(),children:(0,r.jsxs)("div",{className:u()("components-base-control","autocomplete-base-control",t),ref:O,children:[(0,r.jsxs)("div",{"aria-expanded":S,"aria-haspopup":"listbox","aria-owns":`listbox-${y}`,className:u()("components-base-control__field","autocomplete-base-control__field"),role:"combobox",children:[(0,r.jsx)("label",{className:u()("components-base-control__label","autocomplete-base-control__label"),htmlFor:`autocomplete-${y}`,children:(0,r.jsx)("div",{children:s})}),N.length>0?(0,r.jsx)("ul",{role:"listbox","aria-labelledby":`autocomplete-${y}`,id:`selected-items-${y}`,className:u()("autocomplete__selection--results","autocomplete__selection-list"),children:N.map((e=>(0,r.jsx)("li",{className:"autocomplete__selection-list--item",children:(0,r.jsx)(d.Button,{className:"autocomplete__selection-list--item--button",isSecondary:!0,isSmall:!0,onClick:()=>B(e),type:"button",children:e.title})},e.title)))}):null,(0,r.jsx)("input",{"aria-autocomplete":"list",autoComplete:"off",className:u()("components-text-control__input","autocomplete-text-control__input",{"autocomplete-text-control__input--working":S}),id:`autocomplete-${y}`,onChange:e=>I(e.target.value),onFocus:()=>k(!0),placeholder:p,type:"text",value:T})]}),(0,r.jsx)(w,{emptyLabel:n,error:v,labelledById:`autocomplete-${y}`,id:`listbox-${y}`,isOpen:S,loading:E&&L,onSelect:B,options:x,selectedItems:N,threshold:g,value:L})]})})};U.defaultProps={type:"post",className:"",emptyLabel:(0,p.__)("No items found","alley-scripts"),label:(0,p.__)("Search for items","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,p.__)("Search for items","alley-scripts"),subTypes:[],selected:[],threshold:3},U.propTypes={type:o().string,className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const B=U},1917:(e,t,n)=>{"use strict";n.d(t,{default:()=>i});var r=n(7e3),s=n(7287),o=n(3396);function i({children:e,index:t,list:n,setList:i}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(s.Button,{disabled:0===t,icon:"arrow-up-alt2",label:(0,o.__)("Move up","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t-1,0,e.splice(t,1)[0]),i(e)}}),(0,r.jsx)(s.Button,{disabled:t===n.length-1,icon:"arrow-down-alt2",label:(0,o.__)("Move down","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t+1,0,e.splice(t,1)[0]),i(e)}}),(0,r.jsx)(s.Button,{icon:"trash",label:(0,o.__)("Remove","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t,1),i(e)}})]}),(0,r.jsx)("div",{children:e})]})}},8504:(e,t,n)=>{"use strict";n.d(t,{default:()=>i});var r=n(7e3),s=n(7287),o=n(3396);function i({children:e,emptyItem:t,list:n,setList:i}){return(0,r.jsxs)(r.Fragment,{children:[e,(0,r.jsx)("div",{style:{margin:"1em 0"},children:(0,r.jsx)(s.Button,{icon:"plus",onClick:()=>i([...n,t]),variant:"primary",children:(0,o.__)("Add Item","alley-scripts")})})]})}},668:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(900),o=n.n(s),i=n(3396),a=n(7720);const l=({className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d})=>(0,r.jsx)(a.Selector,{type:"term",className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d});l.defaultProps={className:"",emptyLabel:(0,i.__)("No terms found","alley-scripts"),label:(0,i.__)("Search for terms","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,i.__)("Search for terms","alley-scripts"),subTypes:[],selected:[],threshold:3},l.propTypes={className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const c=l},5316:(e,t,n)=>{"use strict";n.d(t,{default:()=>d});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(7720);const l=i.cp.div` + height: auto; + width: 100%; +`,c=({src:e})=>(0,r.jsx)(l,{children:(0,r.jsx)("video",{className:"edit-video-preview",controls:!0,src:e})});c.propTypes={src:o().string.isRequired};const u=({className:e,onReset:t,onUpdate:n,onUpdateURL:s,value:o,valueURL:i})=>(0,r.jsx)(a.MediaPicker,{allowedTypes:["video"],className:e,icon:"format-video",onReset:t,onUpdate:n,onUpdateURL:s,preview:c,value:o,valueURL:i});u.defaultProps={className:"",onUpdateURL:null,valueURL:""},u.propTypes={className:o().string,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,value:o().number.isRequired,valueURL:o().string};const d=u},2e3:(e,t,n)=>{"use strict";n.d(t,{useCurrentPostId:()=>r.default,useCurrentTheme:()=>s.default,useDebounce:()=>o.default,useHasInnerBlocks:()=>i.default,useInnerBlocks:()=>a.default,useInnerBlocksAttributes:()=>l.default,useInnerBlocksCount:()=>c.default,useInnerBlocksIndex:()=>u.default,useMedia:()=>d.default,useOption:()=>p.default,useParentBlock:()=>f.default,useParentBlockAttributes:()=>h.default,usePost:()=>m.default,usePostById:()=>g.default,usePostMeta:()=>y.default,usePostMetaValue:()=>v.default,usePosts:()=>b.default,usePreviewLink:()=>A.default,useTerm:()=>_.default,useTerms:()=>w.default});var r=n(9695),s=n(5904),o=n(7112),i=n(6980),a=n(864),l=n(8512),c=n(1344),u=n(6644),d=n(592),p=n(7188),f=n(224),h=n(8004),m=n(1744),g=n(9480),y=n(6504),v=n(3772),b=n(4704),A=n(7532),_=n(7712),w=n(1848)},9695:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>{const t=e("core/editor");return t?t.getCurrentPostId():null}),[])},5904:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>{const t=e("core");return t?t.getCurrentTheme()?.stylesheet:null}),[])},7112:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(1280);const s=(e,t)=>{const[n,s]=(0,r.useState)(e);return(0,r.useEffect)((()=>{const n=setTimeout((()=>{s(e)}),t);return()=>{clearTimeout(n)}}),[e,t]),n}},6980:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocksCount)(e)>0},6644:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>{const t=(0,r.useParentBlock)(e),n=(0,r.useInnerBlocks)(t);return n?n.findIndex((t=>t.clientId===e)):-1}},8512:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocks)(e).map((e=>e.attributes))},1344:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocks)(e).length},864:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>t(r.store).getBlocks(e)),[e])},592:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=e=>(0,r.useSelect)((t=>t("core").getMedia(e)),[e])},7188:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=function(e){const t=(0,r.useSelect)((t=>{const{getEditedEntityRecord:n,getEntityRecordEdits:r,isSavingEntityRecord:s}=t("core"),o=n("root","site"),i=r("root","site");return{value:o?.[e],isEdited:!!i?.[e],isSaving:s("root","site")}}),[]),{editEntityRecord:n,saveEntityRecord:s}=(0,r.useDispatch)("core");return{...t,onChange:function(t){n("root","site",void 0,{[e]:t})},onSave:async function(){await s("root","site",{[e]:t.value})}}}},8004:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>{const{getBlockAttributes:n,getBlockRootClientId:s}=t(r.store),o=s(e);return o?n(o):null}),[e])},224:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>{const{getBlock:n,getBlockRootClientId:s}=t(r.store),o=s(e);return o?n(o):null}),[e])},9480:(e,t,n)=>{"use strict";n.d(t,{default:()=>l});var r=n(1280),s=n(4632),o=n.n(s),i=n(7204),a=n(1744);const l=(e,t=null,n={context:"view"})=>{const[s,l]=(0,r.useState)({}),[c,u]=(0,r.useState)(!0);(0,r.useEffect)((()=>{u(!0),e&&!s[e]?(async()=>{if(t){const n=await t(e);n?l((t=>({...t,[e]:n}))):console.error(`Custom function to get post with ID ${e} failed.`)}else{const t=(0,i.addQueryArgs)("/wp/v2/search",{include:e}),n=await o()({path:t});n.length>0&&l((t=>({...t,[e]:n[0]?.subtype})))}u(!1)})():e&&s[e]&&u(!1)}),[e]);const d=(0,a.default)(e,s[e]??"",n);return c||!d&&s[e]?null:d}},3772:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=(e,t=null,n=null)=>{const[s,o]=(0,r.usePostMeta)(t,n);return[s[e],t=>o({...s,[e]:t})]}},6504:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(3048),s=n(7752);const o=(e=null,t=null)=>{const n=(0,s.useSelect)((t=>e||t("core/editor").getCurrentPostType()),[]),[o,i]=(0,r.useEntityProp)("postType",n,"meta",t),a="function"==typeof i?i:()=>console.error(`Error attempting to set post meta for post type ${n}. Does it have support for custom-fields?`);return["object"==typeof o?o:{},e=>a({...e})]}},1744:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="post",n={context:"view"})=>(0,r.useSelect)((r=>r("core").getEntityRecord("postType",t,e,n)),[e,t])},4704:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="post")=>(0,r.useSelect)((n=>{const{getEntityRecords:r}=n("core");return r("postType",t,{include:e})}),[e,t])},7532:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>e("core").getEditedPostPreviewLink()),[])},7712:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="category",n={context:"view"})=>(0,r.useSelect)((r=>r("core").getEntityRecord("taxonomy",t,e,n)),[e,t])},1848:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(3048),s=n(7752);const o=(e=null,t=null,n="categories")=>{const o=(0,s.useSelect)((t=>e||t("core/editor").getCurrentPostType()),[]),[i,a]=(0,r.useEntityProp)("postType",o,n,t);return[i,e=>a(e)]}},5328:(e,t,n)=>{"use strict";n.d(t,{getMediaUrl:()=>i.c,parseCSVFile:()=>o});var r=n(2232),s=n.n(r);const o=e=>new Promise(((t,n)=>{s().parse(e,{complete:e=>t(e.data),dynamicTyping:!0,error:e=>n(e),header:!0,skipEmptyLines:!0})}));var i=n(6199)},6199:(e,t,n)=>{"use strict";n.d(t,{c:()=>r});const r=(e,t="full")=>{const{media_details:{sizes:{[t]:{source_url:n=""}={},full:{source_url:r=""}={}}={}}={},sizes:{[t]:{url:s=""}={},full:{url:o=""}={}}={},source_url:i="",url:a=""}=e;return s||n||o||r||a||i||""}},1280:e=>{"use strict";e.exports=window.React},4632:e=>{"use strict";e.exports=window.wp.apiFetch},9528:e=>{"use strict";e.exports=window.wp.blockEditor},7287:e=>{"use strict";e.exports=window.wp.components},3048:e=>{"use strict";e.exports=window.wp.coreData},7752:e=>{"use strict";e.exports=window.wp.data},3396:e=>{"use strict";e.exports=window.wp.i18n},7204:e=>{"use strict";e.exports=window.wp.url}},t={};function n(r){var s=t[r];if(void 0!==s)return s.exports;var o=t[r]={id:r,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var r={};return(()=>{"use strict";n.r(r),n.d(r,{AudioPicker:()=>e.AudioPicker,CSVUploader:()=>e.CSVUploader,Checkboxes:()=>e.Checkboxes,ImagePicker:()=>e.ImagePicker,MediaPicker:()=>e.MediaPicker,PostPicker:()=>e.PostPicker,PostSelector:()=>e.PostSelector,SafeHtml:()=>e.SafeHtml,Selector:()=>e.Selector,Sortable:()=>e.Sortable,SortableItem:()=>e.SortableItem,TermSelector:()=>e.TermSelector,VideoPicker:()=>e.VideoPicker,getMediaUrl:()=>s.getMediaUrl,parseCSVFile:()=>s.parseCSVFile,useCurrentPostId:()=>t.useCurrentPostId,useCurrentTheme:()=>t.useCurrentTheme,useDebounce:()=>t.useDebounce,useHasInnerBlocks:()=>t.useHasInnerBlocks,useInnerBlocks:()=>t.useInnerBlocks,useInnerBlocksAttributes:()=>t.useInnerBlocksAttributes,useInnerBlocksCount:()=>t.useInnerBlocksCount,useInnerBlocksIndex:()=>t.useInnerBlocksIndex,useMedia:()=>t.useMedia,useOption:()=>t.useOption,useParentBlock:()=>t.useParentBlock,useParentBlockAttributes:()=>t.useParentBlockAttributes,usePost:()=>t.usePost,usePostById:()=>t.usePostById,usePostMeta:()=>t.usePostMeta,usePostMetaValue:()=>t.usePostMetaValue,usePosts:()=>t.usePosts,usePreviewLink:()=>t.usePreviewLink,useTerm:()=>t.useTerm,useTerms:()=>t.useTerms});var e=n(7720),t=n(2e3),s=n(5328)})(),r})(),e.exports=t()},251:function(e,t,n){"use strict";var r=n(196),s=Symbol.for("react.element"),o=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),i=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var r,l={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)o.call(t,r)&&!a.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===l[r]&&(l[r]=t[r]);return{$$typeof:s,type:e,key:c,ref:u,props:l,_owner:i.current}}t.jsx=l,t.jsxs=l},893:function(e,t,n){"use strict";e.exports=n(251)},196:function(e){"use strict";e.exports=window.React},967:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function s(){for(var e="",t=0;tparseInt(e,10))).findIndex((e=>e===f)),x=null!==(r=A[w])&&void 0!==r?r:null,C=null!==x&&x!==f,S=(0,c.useCallback)((e=>{const t=[...A];null!==e&&t.includes(e)&&t.splice(t.indexOf(e),1,null),t[w]=e,(0,i.dispatch)("core/block-editor").updateBlockAttributes(y,{posts:t})}),[w,A,y]),k=(0,i.useSelect)((e=>e("core/block-editor").hasSelectedInnerBlock(p,!0)),[p]);return(0,u.jsxs)("div",{...(0,t.useBlockProps)({className:s()("wp-curate-post-block",{"wp-curate-post-block--selected":k},{"wp-curate-post-block--backfill":!x||C},{"curate-droppable":m.postId&&m.postId!==f},{"wp-curate-error":C})}),children:[(0,u.jsx)(t.InnerBlocks,{}),k||g?(0,u.jsxs)("div",{className:"wp-curate-post-block__actions",children:[x&&!C?(0,u.jsx)(l.Button,{variant:"secondary",onClick:()=>{const e=m.postId?{}:{postId:f,clientId:p};b.forEach((t=>{(0,i.dispatch)("core/block-editor").updateBlockAttributes(t,{moveData:e})}));const t=()=>{b.forEach((e=>{(0,i.dispatch)("core/block-editor").updateBlockAttributes(e,{moveData:{}})}))},n=r=>{let s=r.target;if(s.classList.contains("wp-curate-post-block")&&(s=s.parentElement),s.classList.contains("wp-block-post")||s.classList.contains("components-button")){if(s.classList.contains("wp-block-post")){var o;r.preventDefault();const a=s.parentNode;if(!a)return;let l=Array.prototype.indexOf.call(a.children,s);a.classList.contains("is-selected")&&(l-=1);const c=a.dataset.block,u=(0,i.select)("core/block-editor").getBlockParentsByBlockName(c,"wp-curate/query")[0];if(!u)return;const d=(null!==(o=(0,i.select)("core/block-editor").getBlockAttributes(u)?.posts)&&void 0!==o?o:[]).map((t=>t===e.postId?null:t));d[l]=e.postId,(0,i.dispatch)("core/block-editor").updateBlockAttributes(u,{posts:d});const p=(0,i.select)("core/block-editor").getBlockParentsByBlockName(e.clientId,"wp-curate/query")[0];if(u!==p){const t=(0,i.select)("core/block-editor").getBlockAttributes(p)?.posts,n=t.map((t=>t===e.postId?null:t));(0,i.dispatch)("core/block-editor").updateBlockAttributes(p,{posts:n})}t(),window.removeEventListener("click",n),setTimeout((()=>{document.querySelectorAll(`.post-${e.postId}`)[0]?.scrollIntoViewIfNeeded({behavior:"smooth",block:"start"})}),500)}}else window.removeEventListener("click",n),t()};e.postId&&window.addEventListener("click",n)},children:m.postId?(0,a.__)("Cancel","wp-curate"):(0,a.__)("Move Post","wp-curate")}):(0,u.jsx)("span",{}),(0,u.jsx)(o.PostPicker,{allowedTypes:_,onUpdate:S,onReset:()=>{S(null)},value:null!=x?x:0,previewRender:d,className:"wp-curate-post-block__post-picker",selectText:(0,a.__)("Pin a post","wp-curate"),resetText:(0,a.__)("Backfill post","wp-curate"),replaceText:(0,a.__)("Pin a different post","wp-curate")})]}):null]})},save:()=>{const e=t.useBlockProps.save();return(0,u.jsx)("div",{...e,children:(0,u.jsx)(t.InnerBlocks.Content,{})})}})}()}(); \ No newline at end of file diff --git a/build/post/index.php b/build/post/index.php new file mode 100644 index 00000000..57999c84 --- /dev/null +++ b/build/post/index.php @@ -0,0 +1,24 @@ +should_register_block() ) { + return; + } + + // Register the block by passing the location of block.json. + register_block_type( + __DIR__ + ); +} +add_action( 'init', 'wp_curate_post_block_init' ); diff --git a/build/post/render.php b/build/post/render.php new file mode 100644 index 00000000..14833e08 --- /dev/null +++ b/build/post/render.php @@ -0,0 +1,15 @@ +. + * @var WP_Block $block The instance of the WP_Block class that represents the block being rendered. + * + * @package wp-curate + */ + +echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Rendered by Gutenberg. diff --git a/build/query/block.json b/build/query/block.json new file mode 100644 index 00000000..b5ec687f --- /dev/null +++ b/build/query/block.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "wp-curate/query", + "version": "0.1.0", + "title": "Query", + "category": "theme", + "icon": "filter", + "description": "Custom queries for WP Curate", + "textdomain": "wp-curate", + "editorScript": "file:index.js", + "editorStyle": "file:index.css", + "style": [ + "file:style-index.css" + ], + "providesContext": { + "query": "query", + "displayLayout": "displayLayout", + "heading": "heading", + "curation": "curation", + "pinnedPosts": "posts", + "moveData": "moveData", + "customPostTitles": "customPostTitles" + }, + "attributes": { + "deduplication": { + "default": "inherit", + "enum": [ + "inherit", + "never" + ], + "type": "string" + }, + "minNumberOfPosts": { + "default": 1, + "type": "number" + }, + "numberOfPosts": { + "default": 5, + "type": "number" + }, + "offset": { + "default": 0, + "type": "number" + }, + "postTypes": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "posts": { + "default": [], + "items": { + "type": "number" + }, + "type": "array" + }, + "searchTerm": { + "default": "", + "type": "string" + }, + "terms": { + "default": {}, + "items": { + "default": [], + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "termRelations": { + "default": {}, + "items": { + "default": "AND", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "type": "object" + }, + "taxRelation": { + "default": "AND", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "orderby": { + "default": "date", + "enum": [ + "date", + "trending" + ], + "type": "string" + }, + "customPostTitles": { + "default": [], + "items": { + "default": {}, + "type": "object" + }, + "type": "array" + } + } +} \ No newline at end of file diff --git a/build/query/index.asset.php b/build/query/index.asset.php new file mode 100644 index 00000000..acfd95b8 --- /dev/null +++ b/build/query/index.asset.php @@ -0,0 +1 @@ + array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => 'bbc7b3412e4b948789db'); diff --git a/build/query/index.css b/build/query/index.css new file mode 100644 index 00000000..5b314f14 --- /dev/null +++ b/build/query/index.css @@ -0,0 +1 @@ +.autocomplete__component .components-base-control__label{display:inline-block;font-size:11px;font-weight:500;line-height:1.4;margin-bottom:8px;text-transform:uppercase}.manual-posts__container{gap:1rem}.manual-posts__picker{border:1px dashed #e0e0e0;flex:1;padding:8px}.manual-posts__picker>.components-button{justify-content:center;width:100%}.manual-posts__container--selected .manual-posts__picker{border:0;padding:0 0 16px}.manual-posts__container--selected .manual-posts__picker>*{width:100%}.manual-posts__counter{font-weight:500}.manual-posts:has(.manual-posts__container:nth-last-child(10)) .manual-posts__counter{min-width:18px} diff --git a/build/query/index.js b/build/query/index.js new file mode 100644 index 00000000..bcb2265b --- /dev/null +++ b/build/query/index.js @@ -0,0 +1,42 @@ +!function(){var e,t={373:function(e){var t;self,t=()=>(()=>{var e={6484:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function s(){for(var e=[],t=0;t{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".alley-scripts-post-picker__post-list{display:flex;flex-wrap:wrap;float:left;height:calc(70vh - 200px);justify-content:flex-start;overflow-y:auto;padding:8px;width:100%}.alley-scripts-post-picker__post{border:1px solid #eee;height:auto;justify-content:center;margin:0 8px 8px 0;transition:background-color .2s ease-in-out;width:calc((100% - 40px)/3)}@media(min-width: 780px){.alley-scripts-post-picker__post{width:calc((100% - 40px)/5)}}.alley-scripts-post-picker__post:hover{background-color:#f0f0f0}.alley-scripts-post-picker__post.is-selected{background-color:#f0f0f0}.alley-scripts-post-picker__load-more{clear:both;float:left;text-align:center;width:100%}","",{version:3,sources:["webpack://./src/components/post-picker/post-list.scss"],names:[],mappings:"AAAA,sCACE,YAAA,CACA,cAAA,CACA,UAAA,CACA,yBAAA,CACA,0BAAA,CACA,eAAA,CACA,WAAA,CACA,UAAA,CAGF,iCACE,qBAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,2CAAA,CACA,2BAAA,CAGA,yBATF,iCAUI,2BAAA,CAAA,CAGF,uCACE,wBAAA,CAGF,6CACE,wBAAA,CAIJ,sCACE,UAAA,CACA,UAAA,CACA,iBAAA,CACA,UAAA",sourcesContent:[".alley-scripts-post-picker__post-list {\n display: flex;\n flex-wrap: wrap;\n float: left;\n height: calc(70vh - 200px);\n justify-content: flex-start;\n overflow-y: auto;\n padding: 8px;\n width: 100%;\n}\n\n.alley-scripts-post-picker__post {\n border: 1px solid #eee;\n height: auto;\n justify-content: center;\n margin: 0 8px 8px 0;\n transition: background-color 0.2s ease-in-out;\n width: calc((100% - 40px) / 3);\n\n\n @media (min-width: 780px) {\n width: calc((100% - 40px) / 5);\n }\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n &.is-selected {\n background-color: #f0f0f0;\n }\n}\n\n.alley-scripts-post-picker__load-more {\n clear: both;\n float: left;\n text-align: center;\n width: 100%;\n}\n"],sourceRoot:""}]);const a=i},9680:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".alley-scripts-post-picker__modal .components-modal__content{width:90vw}.alley-scripts-post-picker__buttons{clear:both;display:block;text-align:right;width:100%}.alley-scripts-post-picker__buttons button{margin:5px}","",{version:3,sources:["webpack://./src/components/post-picker/search-modal.scss"],names:[],mappings:"AACE,6DACE,UAAA,CAIJ,oCACE,UAAA,CACA,aAAA,CACA,gBAAA,CACA,UAAA,CAEA,2CACE,UAAA",sourcesContent:[".alley-scripts-post-picker__modal {\n .components-modal__content {\n width: 90vw;\n }\n}\n\n.alley-scripts-post-picker__buttons {\n clear: both;\n display: block;\n text-align: right;\n width: 100%;\n\n button {\n margin: 5px;\n }\n}\n"],sourceRoot:""}]);const a=i},3800:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".post-picker-notice{margin:0 0 .5rem 0}","",{version:3,sources:["webpack://./src/components/post-picker/style.scss"],names:[],mappings:"AAAA,oBACE,kBAAA",sourcesContent:[".post-picker-notice {\n margin: 0 0 0.5rem 0;\n}\n"],sourceRoot:""}]);const a=i},5500:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,'.edit-post-sidebar .autocomplete__component,.editor-styles-wrapper .autocomplete__component{margin-bottom:20px}.edit-post-sidebar .autocomplete-base-control,.editor-styles-wrapper .autocomplete-base-control{position:relative}.edit-post-sidebar .autocomplete-text-control__input,.editor-styles-wrapper .autocomplete-text-control__input{margin:0}.edit-post-sidebar .autocomplete__selection-list,.editor-styles-wrapper .autocomplete__selection-list{list-style-type:none;margin:0 0 6px;padding:0}.edit-post-sidebar .autocomplete__selection-list--item,.editor-styles-wrapper .autocomplete__selection-list--item{display:inline-block;list-style:none}.edit-post-sidebar .autocomplete__selection-list--item--button,.editor-styles-wrapper .autocomplete__selection-list--item--button{margin-bottom:4px;margin-right:3px}.edit-post-sidebar .autocomplete__selection-list--item--button::after,.editor-styles-wrapper .autocomplete__selection-list--item--button::after{content:"×";font-size:16px;line-height:20px;margin-left:5px}.edit-post-sidebar .autocomplete__dropdown,.editor-styles-wrapper .autocomplete__dropdown{background-color:#fff;border-color:rgba(0,0,0,0) #e2e4e7 #e2e4e7;border-radius:0 0 4px 4px;border-style:solid;border-width:0 1px 1px;left:0;max-height:0;overflow-y:hidden;position:absolute;top:calc(100% + 1px);visibility:hidden;width:100%;z-index:10}.edit-post-sidebar .autocomplete__dropdown--is-open,.editor-styles-wrapper .autocomplete__dropdown--is-open{box-shadow:0 3px 30px rgba(25,30,35,.1);max-height:225px;overflow-y:scroll;visibility:visible}.edit-post-sidebar .autocomplete__dropdown--notice,.editor-styles-wrapper .autocomplete__dropdown--notice{padding:15px}.edit-post-sidebar .autocomplete__dropdown--results,.editor-styles-wrapper .autocomplete__dropdown--results{list-style:none;margin:0;padding:0}.edit-post-sidebar .autocomplete__list--item,.editor-styles-wrapper .autocomplete__list--item{list-style:none}.edit-post-sidebar .autocomplete__list--item>button,.editor-styles-wrapper .autocomplete__list--item>button{background:rgba(0,0,0,0);border-color:#e2e4e7;border-style:solid;border-width:0 0 1px;height:100%;line-height:1.25;text-align:left;white-space:inherit;width:100%}.edit-post-sidebar .autocomplete__list--item:last-child>button,.editor-styles-wrapper .autocomplete__list--item:last-child>button{border-bottom:0}',"",{version:3,sources:["webpack://./src/components/selector/styles.scss"],names:[],mappings:"AAAA,4FAgBI,kBACE,CAAA,gGAMF,iBACE,CAAA,8GAMF,QACE,CAAA,sGAMF,oBACE,CAAA,cACA,CAAA,SACA,CAAA,kHAEA,oBACE,CAAA,eACA,CAAA,kIAEA,iBACE,CAAA,gBACA,CAAA,gJAEA,WACE,CAAA,cACA,CAAA,gBACA,CAAA,eACA,CAAA,0FASR,qBACE,CAAA,0CACA,CAAA,yBACA,CAAA,kBACA,CAAA,sBACA,CAAA,MACA,CAAA,YACA,CAAA,iBACA,CAAA,iBACA,CAAA,oBACA,CAAA,iBACA,CAAA,UACA,CAAA,UACA,CAAA,4GAGA,uCACE,CAAA,gBACA,CAAA,iBACA,CAAA,kBACA,CAAA,0GAIF,YACE,CAAA,4GAIF,eACE,CAAA,QACA,CAAA,SACA,CAAA,8FAOJ,eACE,CAAA,4GAEA,wBACE,CAAA,oBACA,CAAA,kBACA,CAAA,oBACA,CAAA,WACA,CAAA,gBACA,CAAA,eACA,CAAA,mBACA,CAAA,UACA,CAAA,kIAGF,eACE",sourcesContent:["//--------------------------------------------------------------\n// AutoComplete Styles\n//--------------------------------------------------------------\n\n/* stylelint-disable max-nesting-depth */\n\n//-----------------------------------------\n// Accommodate editor well, or the sidebar.\n//-----------------------------------------\n.edit-post-sidebar,\n.editor-styles-wrapper {\n .autocomplete {\n\n //-----------------------------------------\n // Parent form wrapper.\n //-----------------------------------------\n &__component {\n margin-bottom: 20px;\n }\n\n //-----------------------------------------\n // Wrapper\n //-----------------------------------------\n &-base-control {\n position: relative;\n }\n\n //-----------------------------------------\n // Input\n //-----------------------------------------\n &-text-control__input {\n margin: 0;\n }\n\n //-----------------------------------------\n // Selected buttons.\n //-----------------------------------------\n &__selection-list {\n list-style-type: none;\n margin: 0 0 6px;\n padding: 0;\n\n &--item {\n display: inline-block;\n list-style: none;\n\n &--button {\n margin-bottom: 4px;\n margin-right: 3px;\n\n &::after {\n content: '×';\n font-size: 16px;\n line-height: 20px;\n margin-left: 5px;\n }\n }\n }\n }\n\n //-----------------------------------------\n // Results\n //-----------------------------------------\n &__dropdown {\n background-color: #fff;\n border-color: transparent #e2e4e7 #e2e4e7;\n border-radius: 0 0 4px 4px;\n border-style: solid;\n border-width: 0 1px 1px;\n left: 0;\n max-height: 0;\n overflow-y: hidden;\n position: absolute;\n top: calc(100% + 1px); // Offset focus border.\n visibility: hidden;\n width: 100%;\n z-index: 10;\n\n // Container is open.\n &--is-open {\n box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1);\n max-height: 225px;\n overflow-y: scroll;\n visibility: visible;\n }\n\n // Notice handler.\n &--notice {\n padding: 15px;\n }\n\n // Results container.\n &--results {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n }\n\n //-----------------------------------------\n // List/Results\n //-----------------------------------------\n &__list--item {\n list-style: none;\n\n > button {\n background: transparent;\n border-color: #e2e4e7;\n border-style: solid;\n border-width: 0 0 1px;\n height: 100%;\n line-height: 1.25;\n text-align: left;\n white-space: inherit;\n width: 100%;\n }\n\n &:last-child > button {\n border-bottom: 0;\n }\n }\n }\n}\n"],sourceRoot:""}]);const a=i},1849:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var a=0;a0?" ".concat(u[5]):""," {").concat(u[1],"}")),u[5]=o),n&&(u[2]?(u[1]="@media ".concat(u[2]," {").concat(u[1],"}"),u[2]=n):u[2]=n),s&&(u[4]?(u[1]="@supports (".concat(u[4],") {").concat(u[1],"}"),u[4]=s):u[4]="".concat(s)),t.push(u))}},t}},2876:e=>{"use strict";e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var r=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),s="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),o="/*# ".concat(s," */");return[t].concat([o]).join("\n")}return[t].join("\n")}},6595:function(e){e.exports=function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:r,getOwnPropertyDescriptor:s}=Object;let{freeze:o,seal:i,create:a}=Object,{apply:l,construct:c}="undefined"!=typeof Reflect&&Reflect;o||(o=function(e){return e}),i||(i=function(e){return e}),l||(l=function(e,t,n){return e.apply(t,n)}),c||(c=function(e,t){return new e(...t)});const u=w(Array.prototype.forEach),d=w(Array.prototype.pop),p=w(Array.prototype.push),f=w(String.prototype.toLowerCase),h=w(String.prototype.toString),m=w(String.prototype.match),g=w(String.prototype.replace),y=w(String.prototype.indexOf),v=w(String.prototype.trim),b=w(RegExp.prototype.test),_=(A=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),s=1;s2&&void 0!==arguments[2]?arguments[2]:f;t&&t(e,null);let o=r.length;for(;o--;){let t=r[o];if("string"==typeof t){const e=s(t);e!==t&&(n(r)||(r[o]=e),t=e)}e[t]=!0}return e}function C(t){const n=a(null);for(const[r,o]of e(t))void 0!==s(t,r)&&(n[r]=o);return n}function S(e,t){for(;null!==e;){const n=s(e,t);if(n){if(n.get)return w(n.get);if("function"==typeof n.value)return w(n.value)}e=r(e)}return function(e){return console.warn("fallback value for",e),null}}const k=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),E=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),R=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),T=o(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),I=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),P=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),O=o(["#text"]),N=o(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),j=o(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),L=o(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),D=o(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),U=i(/\{\{[\w\W]*|[\w\W]*\}\}/gm),M=i(/<%[\w\W]*|[\w\W]*%>/gm),B=i(/\${[\w\W]*}/gm),F=i(/^data-[\-\w.\u00B7-\uFFFF]/),z=i(/^aria-[\-\w]+$/),q=i(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),$=i(/^(?:\w+script|data):/i),W=i(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),H=i(/^html$/i);var G=Object.freeze({__proto__:null,MUSTACHE_EXPR:U,ERB_EXPR:M,TMPLIT_EXPR:B,DATA_ATTR:F,ARIA_ATTR:z,IS_ALLOWED_URI:q,IS_SCRIPT_OR_DATA:$,ATTR_WHITESPACE:W,DOCTYPE_NAME:H});return function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"undefined"==typeof window?null:window;const r=e=>t(e);if(r.version="3.0.6",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;let{document:s}=n;const i=s,l=i.currentScript,{DocumentFragment:c,HTMLTemplateElement:A,Node:w,Element:U,NodeFilter:M,NamedNodeMap:B=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:F,DOMParser:z,trustedTypes:$}=n,W=U.prototype,V=S(W,"cloneNode"),Y=S(W,"nextSibling"),Q=S(W,"childNodes"),K=S(W,"parentNode");if("function"==typeof A){const e=s.createElement("template");e.content&&e.content.ownerDocument&&(s=e.content.ownerDocument)}let J,X="";const{implementation:Z,createNodeIterator:ee,createDocumentFragment:te,getElementsByTagName:ne}=s,{importNode:re}=i;let se={};r.isSupported="function"==typeof e&&"function"==typeof K&&Z&&void 0!==Z.createHTMLDocument;const{MUSTACHE_EXPR:oe,ERB_EXPR:ie,TMPLIT_EXPR:ae,DATA_ATTR:le,ARIA_ATTR:ce,IS_SCRIPT_OR_DATA:ue,ATTR_WHITESPACE:de}=G;let{IS_ALLOWED_URI:pe}=G,fe=null;const he=x({},[...k,...E,...R,...I,...O]);let me=null;const ge=x({},[...N,...j,...L,...D]);let ye=Object.seal(a(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,be=null,_e=!0,Ae=!0,we=!1,xe=!0,Ce=!1,Se=!1,ke=!1,Ee=!1,Re=!1,Te=!1,Ie=!1,Pe=!0,Oe=!1,Ne=!0,je=!1,Le={},De=null;const Ue=x({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Me=null;const Be=x({},["audio","video","img","source","image","track"]);let Fe=null;const ze=x({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),qe="http://www.w3.org/1998/Math/MathML",$e="http://www.w3.org/2000/svg",We="http://www.w3.org/1999/xhtml";let He=We,Ge=!1,Ve=null;const Ye=x({},[qe,$e,We],h);let Qe=null;const Ke=["application/xhtml+xml","text/html"];let Je=null,Xe=null;const Ze=s.createElement("form"),et=function(e){return e instanceof RegExp||e instanceof Function},tt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!Xe||Xe!==e){if(e&&"object"==typeof e||(e={}),e=C(e),Qe=Qe=-1===Ke.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Je="application/xhtml+xml"===Qe?h:f,fe="ALLOWED_TAGS"in e?x({},e.ALLOWED_TAGS,Je):he,me="ALLOWED_ATTR"in e?x({},e.ALLOWED_ATTR,Je):ge,Ve="ALLOWED_NAMESPACES"in e?x({},e.ALLOWED_NAMESPACES,h):Ye,Fe="ADD_URI_SAFE_ATTR"in e?x(C(ze),e.ADD_URI_SAFE_ATTR,Je):ze,Me="ADD_DATA_URI_TAGS"in e?x(C(Be),e.ADD_DATA_URI_TAGS,Je):Be,De="FORBID_CONTENTS"in e?x({},e.FORBID_CONTENTS,Je):Ue,ve="FORBID_TAGS"in e?x({},e.FORBID_TAGS,Je):{},be="FORBID_ATTR"in e?x({},e.FORBID_ATTR,Je):{},Le="USE_PROFILES"in e&&e.USE_PROFILES,_e=!1!==e.ALLOW_ARIA_ATTR,Ae=!1!==e.ALLOW_DATA_ATTR,we=e.ALLOW_UNKNOWN_PROTOCOLS||!1,xe=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ce=e.SAFE_FOR_TEMPLATES||!1,Se=e.WHOLE_DOCUMENT||!1,Re=e.RETURN_DOM||!1,Te=e.RETURN_DOM_FRAGMENT||!1,Ie=e.RETURN_TRUSTED_TYPE||!1,Ee=e.FORCE_BODY||!1,Pe=!1!==e.SANITIZE_DOM,Oe=e.SANITIZE_NAMED_PROPS||!1,Ne=!1!==e.KEEP_CONTENT,je=e.IN_PLACE||!1,pe=e.ALLOWED_URI_REGEXP||q,He=e.NAMESPACE||We,ye=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&et(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ye.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&et(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ye.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ye.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ce&&(Ae=!1),Te&&(Re=!0),Le&&(fe=x({},[...O]),me=[],!0===Le.html&&(x(fe,k),x(me,N)),!0===Le.svg&&(x(fe,E),x(me,j),x(me,D)),!0===Le.svgFilters&&(x(fe,R),x(me,j),x(me,D)),!0===Le.mathMl&&(x(fe,I),x(me,L),x(me,D))),e.ADD_TAGS&&(fe===he&&(fe=C(fe)),x(fe,e.ADD_TAGS,Je)),e.ADD_ATTR&&(me===ge&&(me=C(me)),x(me,e.ADD_ATTR,Je)),e.ADD_URI_SAFE_ATTR&&x(Fe,e.ADD_URI_SAFE_ATTR,Je),e.FORBID_CONTENTS&&(De===Ue&&(De=C(De)),x(De,e.FORBID_CONTENTS,Je)),Ne&&(fe["#text"]=!0),Se&&x(fe,["html","head","body"]),fe.table&&(x(fe,["tbody"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw _('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw _('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');J=e.TRUSTED_TYPES_POLICY,X=J.createHTML("")}else void 0===J&&(J=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const r="data-tt-policy-suffix";t&&t.hasAttribute(r)&&(n=t.getAttribute(r));const s="dompurify"+(n?"#"+n:"");try{return e.createPolicy(s,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+s+" could not be created."),null}}($,l)),null!==J&&"string"==typeof X&&(X=J.createHTML(""));o&&o(e),Xe=e}},nt=x({},["mi","mo","mn","ms","mtext"]),rt=x({},["foreignobject","desc","title","annotation-xml"]),st=x({},["title","style","font","a","script"]),ot=x({},E);x(ot,R),x(ot,T);const it=x({},I);x(it,P);const at=function(e){p(r.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},lt=function(e,t){try{p(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!me[e])if(Re||Te)try{at(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ct=function(e){let t=null,n=null;if(Ee)e=""+e;else{const t=m(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Qe&&He===We&&(e=''+e+"");const r=J?J.createHTML(e):e;if(He===We)try{t=(new z).parseFromString(r,Qe)}catch(e){}if(!t||!t.documentElement){t=Z.createDocument(He,"template",null);try{t.documentElement.innerHTML=Ge?X:r}catch(e){}}const o=t.body||t.documentElement;return e&&n&&o.insertBefore(s.createTextNode(n),o.childNodes[0]||null),He===We?ne.call(t,Se?"html":"body")[0]:Se?t.documentElement:o},ut=function(e){return ee.call(e.ownerDocument||e,e,M.SHOW_ELEMENT|M.SHOW_COMMENT|M.SHOW_TEXT,null)},dt=function(e){return"function"==typeof w&&e instanceof w},pt=function(e,t,n){se[e]&&u(se[e],(e=>{e.call(r,t,n,Xe)}))},ft=function(e){let t=null;if(pt("beforeSanitizeElements",e,null),(n=e)instanceof F&&("string"!=typeof n.nodeName||"string"!=typeof n.textContent||"function"!=typeof n.removeChild||!(n.attributes instanceof B)||"function"!=typeof n.removeAttribute||"function"!=typeof n.setAttribute||"string"!=typeof n.namespaceURI||"function"!=typeof n.insertBefore||"function"!=typeof n.hasChildNodes))return at(e),!0;var n;const s=Je(e.nodeName);if(pt("uponSanitizeElement",e,{tagName:s,allowedTags:fe}),e.hasChildNodes()&&!dt(e.firstElementChild)&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return at(e),!0;if(!fe[s]||ve[s]){if(!ve[s]&&mt(s)){if(ye.tagNameCheck instanceof RegExp&&b(ye.tagNameCheck,s))return!1;if(ye.tagNameCheck instanceof Function&&ye.tagNameCheck(s))return!1}if(Ne&&!De[s]){const t=K(e)||e.parentNode,n=Q(e)||e.childNodes;if(n&&t)for(let r=n.length-1;r>=0;--r)t.insertBefore(V(n[r],!0),Y(e))}return at(e),!0}return e instanceof U&&!function(e){let t=K(e);t&&t.tagName||(t={namespaceURI:He,tagName:"template"});const n=f(e.tagName),r=f(t.tagName);return!!Ve[e.namespaceURI]&&(e.namespaceURI===$e?t.namespaceURI===We?"svg"===n:t.namespaceURI===qe?"svg"===n&&("annotation-xml"===r||nt[r]):Boolean(ot[n]):e.namespaceURI===qe?t.namespaceURI===We?"math"===n:t.namespaceURI===$e?"math"===n&&rt[r]:Boolean(it[n]):e.namespaceURI===We?!(t.namespaceURI===$e&&!rt[r])&&!(t.namespaceURI===qe&&!nt[r])&&!it[n]&&(st[n]||!ot[n]):!("application/xhtml+xml"!==Qe||!Ve[e.namespaceURI]))}(e)?(at(e),!0):"noscript"!==s&&"noembed"!==s&&"noframes"!==s||!b(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ce&&3===e.nodeType&&(t=e.textContent,u([oe,ie,ae],(e=>{t=g(t,e," ")})),e.textContent!==t&&(p(r.removed,{element:e.cloneNode()}),e.textContent=t)),pt("afterSanitizeElements",e,null),!1):(at(e),!0)},ht=function(e,t,n){if(Pe&&("id"===t||"name"===t)&&(n in s||n in Ze))return!1;if(Ae&&!be[t]&&b(le,t));else if(_e&&b(ce,t));else if(!me[t]||be[t]){if(!(mt(e)&&(ye.tagNameCheck instanceof RegExp&&b(ye.tagNameCheck,e)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(e))&&(ye.attributeNameCheck instanceof RegExp&&b(ye.attributeNameCheck,t)||ye.attributeNameCheck instanceof Function&&ye.attributeNameCheck(t))||"is"===t&&ye.allowCustomizedBuiltInElements&&(ye.tagNameCheck instanceof RegExp&&b(ye.tagNameCheck,n)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))))return!1}else if(Fe[t]);else if(b(pe,g(n,de,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==y(n,"data:")||!Me[e])if(we&&!b(ue,g(n,de,"")));else if(n)return!1;return!0},mt=function(e){return e.indexOf("-")>0},gt=function(e){pt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:me};let s=t.length;for(;s--;){const o=t[s],{name:i,namespaceURI:a,value:l}=o,c=Je(i);let p="value"===i?l:v(l);if(n.attrName=c,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,pt("uponSanitizeAttribute",e,n),p=n.attrValue,n.forceKeepAttr)continue;if(lt(i,e),!n.keepAttr)continue;if(!xe&&b(/\/>/i,p)){lt(i,e);continue}Ce&&u([oe,ie,ae],(e=>{p=g(p,e," ")}));const f=Je(e.nodeName);if(ht(f,c,p)){if(!Oe||"id"!==c&&"name"!==c||(lt(i,e),p="user-content-"+p),J&&"object"==typeof $&&"function"==typeof $.getAttributeType)if(a);else switch($.getAttributeType(f,c)){case"TrustedHTML":p=J.createHTML(p);break;case"TrustedScriptURL":p=J.createScriptURL(p)}try{a?e.setAttributeNS(a,i,p):e.setAttribute(i,p),d(r.removed)}catch(e){}}}pt("afterSanitizeAttributes",e,null)},yt=function e(t){let n=null;const r=ut(t);for(pt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)pt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof c&&e(n.content),gt(n));pt("afterSanitizeShadowDOM",t,null)};return r.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,s=null,o=null,a=null;if(Ge=!e,Ge&&(e="\x3c!--\x3e"),"string"!=typeof e&&!dt(e)){if("function"!=typeof e.toString)throw _("toString is not a function");if("string"!=typeof(e=e.toString()))throw _("dirty is not a string, aborting")}if(!r.isSupported)return e;if(ke||tt(t),r.removed=[],"string"==typeof e&&(je=!1),je){if(e.nodeName){const t=Je(e.nodeName);if(!fe[t]||ve[t])throw _("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof w)n=ct("\x3c!----\x3e"),s=n.ownerDocument.importNode(e,!0),1===s.nodeType&&"BODY"===s.nodeName||"HTML"===s.nodeName?n=s:n.appendChild(s);else{if(!Re&&!Ce&&!Se&&-1===e.indexOf("<"))return J&&Ie?J.createHTML(e):e;if(n=ct(e),!n)return Re?null:Ie?X:""}n&&Ee&&at(n.firstChild);const l=ut(je?e:n);for(;o=l.nextNode();)ft(o)||(o.content instanceof c&&yt(o.content),gt(o));if(je)return e;if(Re){if(Te)for(a=te.call(n.ownerDocument);n.firstChild;)a.appendChild(n.firstChild);else a=n;return(me.shadowroot||me.shadowrootmode)&&(a=re.call(i,a,!0)),a}let d=Se?n.outerHTML:n.innerHTML;return Se&&fe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&b(H,n.ownerDocument.doctype.name)&&(d="\n"+d),Ce&&u([oe,ie,ae],(e=>{d=g(d,e," ")})),J&&Ie?J.createHTML(d):d},r.setConfig=function(){tt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),ke=!0},r.clearConfig=function(){Xe=null,ke=!1},r.isValidAttribute=function(e,t,n){Xe||tt({});const r=Je(e),s=Je(t);return ht(r,s,n)},r.addHook=function(e,t){"function"==typeof t&&(se[e]=se[e]||[],p(se[e],t))},r.removeHook=function(e){if(se[e])return d(se[e])},r.removeHooks=function(e){se[e]&&(se[e]=[])},r.removeAllHooks=function(){se={}},r}()}()},2232:function(e,t){var n,r;n=function e(){"use strict";var t="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t?t:{},n=!t.document&&!!t.postMessage,r=t.IS_PAPA_WORKER||!1,s={},o=0,i={parse:function(n,r){var a=(r=r||{}).dynamicTyping||!1;if(A(a)&&(r.dynamicTypingFunction=a,a={}),r.dynamicTyping=a,r.transform=!!A(r.transform)&&r.transform,r.worker&&i.WORKERS_SUPPORTED){var l=function(){if(!i.WORKERS_SUPPORTED)return!1;var n,r,a=(n=t.URL||t.webkitURL||null,r=e.toString(),i.BLOB_URL||(i.BLOB_URL=n.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ","(",r,")();"],{type:"text/javascript"})))),l=new t.Worker(a);return l.onmessage=g,l.id=o++,s[l.id]=l}();return l.userStep=r.step,l.userChunk=r.chunk,l.userComplete=r.complete,l.userError=r.error,r.step=A(r.step),r.chunk=A(r.chunk),r.complete=A(r.complete),r.error=A(r.error),delete r.worker,void l.postMessage({input:n,config:r,workerId:l.id})}var f=null;return i.NODE_STREAM_INPUT,"string"==typeof n?(n=function(e){return 65279===e.charCodeAt(0)?e.slice(1):e}(n),f=r.download?new c(r):new d(r)):!0===n.readable&&A(n.read)&&A(n.on)?f=new p(r):(t.File&&n instanceof File||n instanceof Object)&&(f=new u(r)),f.stream(n)},unparse:function(e,t){var n=!1,r=!0,s=",",o="\r\n",a='"',l=a+a,c=!1,u=null,d=!1;!function(){if("object"==typeof t){if("string"!=typeof t.delimiter||i.BAD_DELIMITERS.filter((function(e){return-1!==t.delimiter.indexOf(e)})).length||(s=t.delimiter),("boolean"==typeof t.quotes||"function"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes),"boolean"!=typeof t.skipEmptyLines&&"string"!=typeof t.skipEmptyLines||(c=t.skipEmptyLines),"string"==typeof t.newline&&(o=t.newline),"string"==typeof t.quoteChar&&(a=t.quoteChar),"boolean"==typeof t.header&&(r=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error("Option columns is empty");u=t.columns}void 0!==t.escapeChar&&(l=t.escapeChar+a),("boolean"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(d=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\-@\t\r].*$/)}}();var p=new RegExp(h(a),"g");if("string"==typeof e&&(e=JSON.parse(e)),Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return f(null,e,c);if("object"==typeof e[0])return f(u||Object.keys(e[0]),e,c)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||u),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:"object"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||"object"==typeof e.data[0]||(e.data=[e.data])),f(e.fields||[],e.data||[],c);throw new Error("Unable to serialize unrecognized input");function f(e,t,n){var i="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var a=Array.isArray(e)&&0=this._config.preview;if(r)t.postMessage({results:a,workerId:i.WORKER_ID,finished:c});else if(A(this._config.chunk)&&!n){if(this._config.chunk(a,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);a=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(a.data),this._completeResults.errors=this._completeResults.errors.concat(a.errors),this._completeResults.meta=a.meta),this._completed||!c||!A(this._config.complete)||a&&a.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),c||a&&a.meta.paused||this._nextChunk(),a}this._halted=!0},this._sendError=function(e){A(this._config.error)?this._config.error(e):r&&this._config.error&&t.postMessage({workerId:i.WORKER_ID,error:e,finished:!1})}}function c(e){var t;(e=e||{}).chunkSize||(e.chunkSize=i.RemoteChunkSize),l.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),n||(t.onload=_(this._chunkLoaded,this),t.onerror=_(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var r in e)t.setRequestHeader(r,e[r])}if(this._config.chunkSize){var s=this._start+this._config.chunkSize-1;t.setRequestHeader("Range","bytes="+this._start+"-"+s)}try{t.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===t.status&&this._chunkError()}},this._chunkLoaded=function(){4===t.readyState&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:t.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader("Content-Range");return null===t?-1:parseInt(t.substring(t.lastIndexOf("/")+1))}(t),this.parseChunk(t.responseText)))},this._chunkError=function(e){var n=t.statusText||e;this._sendError(new Error(n))}}function u(e){var t,n;(e=e||{}).chunkSize||(e.chunkSize=i.LocalChunkSize),l.call(this,e);var r="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,r?((t=new FileReader).onload=_(this._chunkLoaded,this),t.onerror=_(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function d(e){var t;l.call(this,e=e||{}),this.stream=function(e){return t=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,n=this._config.chunkSize;return n?(e=t.substring(0,n),t=t.substring(n)):(e=t,t=""),this._finished=!t,this.parseChunk(e)}}}function p(e){l.call(this,e=e||{});var t=[],n=!0,r=!1;this.pause=function(){l.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){l.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):n=!0},this._streamData=_((function(e){try{t.push("string"==typeof e?e:e.toString(this._config.encoding)),n&&(n=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}}),this),this._streamError=_((function(e){this._streamCleanUp(),this._sendError(e)}),this),this._streamEnd=_((function(){this._streamCleanUp(),r=!0,this._streamData("")}),this),this._streamCleanUp=_((function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)}),this)}function f(e){var t,n,r,s=Math.pow(2,53),o=-s,a=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,l=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,c=this,u=0,d=0,p=!1,f=!1,g=[],y={data:[],errors:[],meta:{}};if(A(e.step)){var v=e.step;e.step=function(t){if(y=t,x())w();else{if(w(),0===y.data.length)return;u+=t.data.length,e.preview&&u>e.preview?n.abort():(y.data=y.data[0],v(y,c))}}}function _(t){return"greedy"===e.skipEmptyLines?""===t.join("").trim():1===t.length&&0===t[0].length}function w(){return y&&r&&(S("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+i.DefaultDelimiter+"'"),r=!1),e.skipEmptyLines&&(y.data=y.data.filter((function(e){return!_(e)}))),x()&&function(){if(y)if(Array.isArray(y.data[0])){for(var t=0;x()&&t=g.length?"__parsed_extra":g[r]),e.transform&&(i=e.transform(i,o)),i=C(o,i),"__parsed_extra"===o?(s[o]=s[o]||[],s[o].push(i)):s[o]=i}return e.header&&(r>g.length?S("FieldMismatch","TooManyFields","Too many fields: expected "+g.length+" fields but parsed "+r,d+n):r=r.length/2?"\r\n":"\r"}(s,l)),r=!1,e.delimiter)A(e.delimiter)&&(e.delimiter=e.delimiter(s),y.meta.delimiter=e.delimiter);else{var c=function(t,n,r,s,o){var a,l,c,u;o=o||[",","\t","|",";",i.RECORD_SEP,i.UNIT_SEP];for(var d=0;d=a)return G(!0)}else for(B=u,u++;;){if(-1===(B=i.indexOf(t,B+1)))return f||w.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:_.length,index:u}),W();if(B===m-1)return W(i.substring(u,B).replace(M,t));if(t!==c||i[B+1]!==c){if(t===c||0===B||i[B-1]!==c){-1!==D&&D=a)return G(!0);break}w.push({type:"Quotes",code:"InvalidQuotes",message:"Trailing quote on quoted field is malformed",row:_.length,index:u}),B++}}else B++}return W();function q(e){_.push(e),C=u}function $(e){var t=0;if(-1!==e){var n=i.substring(B+1,e);n&&""===n.trim()&&(t=n.length)}return t}function W(e){return f||(void 0===e&&(e=i.substring(u)),x.push(e),u=m,q(x),b&&V()),G()}function H(e){u=e,q(x),x=[],U=i.indexOf(r,u)}function G(e){return{data:_,errors:w,meta:{delimiter:n,linebreak:r,aborted:d,truncated:!!e,cursor:C+(p||0)}}}function V(){o(G()),_=[],w=[]}},this.abort=function(){d=!0},this.getCharIndex=function(){return u}}function g(e){var t=e.data,n=s[t.workerId],r=!1;if(t.error)n.userError(t.error,t.file);else if(t.results&&t.results.data){var o={abort:function(){r=!0,y(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:v,resume:v};if(A(n.userStep)){for(var i=0;i{"use strict";var r=n(7200);function s(){}function o(){}o.resetWarningCache=s,e.exports=function(){function e(e,t,n,s,o,i){if(i!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:s};return n.PropTypes=n,n}},900:(e,t,n)=>{e.exports=n(7336)()},7200:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4108:(e,t,n)=>{"use strict";var r=n(1280),s=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,o={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:s,type:e,key:c,ref:u,props:o,_owner:a.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},7e3:(e,t,n)=>{"use strict";e.exports=n(4108)},3736:e=>{e.exports=function(e,t,n,r){var s=n?n.call(r,e,t):void 0;if(void 0!==s)return!!s;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var a=Object.prototype.hasOwnProperty.bind(t),l=0;l{"use strict";var t=[];function n(e){for(var n=-1,r=0;r{"use strict";var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},2940:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},9516:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7020:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var s=void 0!==n.layer;s&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,s&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var o=n.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},9296:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},3376:(e,t,n)=>{"use strict";n.d(t,{cp:()=>Ut});var r=function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n2||W(L)>3?"":" "}function V(e,t){for(;--t&&F()&&!(L<48||L>102||L>57&&L<65||L>70&&L<97););return $(e,q()+(t<6&&32==z()&&32==F()))}function Y(e){for(;F();)switch(L){case e:return j;case 34:case 39:34!==e&&39!==e&&Y(L);break;case 40:41===e&&Y(e);break;case 92:F()}return j}function Q(e,t){for(;F()&&e+L!==57&&(e+L!==84||47!==z()););return"/*"+$(t,j-1)+"*"+b(47===e?e:F())}function K(e){for(;!W(z());)F();return $(e,j)}function J(e,t){for(var n="",r=0;r6)switch(S(e,t+1)){case 109:if(45!==S(e,t+4))break;case 102:return x(e,/(.+:)(.+)-([^]+)/,"$1"+d+"$2-$3$1"+u+(108==S(e,t+3)?"$3":"$2-$3"))+e;case 115:return~C(e,"stretch")?Z(x(e,"stretch","fill-available"),t,n)+e:e}break;case 5152:case 5920:return x(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,(function(t,n,r,s,o,i,a){return c+n+":"+r+a+(s?c+n+"-span:"+(o?i:+i-+r)+a:"")+e}));case 4949:if(121===S(e,t+6))return x(e,":",":"+d)+e;break;case 6444:switch(S(e,45===S(e,14)?18:11)){case 120:return x(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+d+(45===S(e,14)?"inline-":"")+"box$3$1"+d+"$2$3$1"+c+"$2box$3")+e;case 100:return x(e,":",":"+c)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return x(e,"scroll-","scroll-snap-")+e}return e}function ee(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case h:return void(e.return=Z(e.value,e.length,n));case g:return J([M(e,{value:x(e.value,"@","@"+d)})],r);case f:if(e.length)return function(e,t){return e.map(t).join("")}(n=e.props,(function(t){switch(w(t,r=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":B(M(e,{props:[x(t,/:(read-\w+)/,":"+u+"$1")]})),B(M(e,{props:[t]})),_(e,{props:I(n,r)});break;case"::placeholder":B(M(e,{props:[x(t,/:(plac\w+)/,":"+d+"input-$1")]})),B(M(e,{props:[x(t,/:(plac\w+)/,":"+u+"$1")]})),B(M(e,{props:[x(t,/:(plac\w+)/,c+"input-$1")]})),B(M(e,{props:[t]})),_(e,{props:I(n,r)})}return""}))}}function te(e){return function(e){return D="",e}(ne("",null,null,null,[""],e=function(e){return P=O=1,N=E(D=e),j=0,[]}(e),0,[0],e))}function ne(e,t,n,r,s,o,i,a,l){for(var c=0,u=0,d=i,p=0,f=0,h=0,m=1,g=1,y=1,v=0,_="",A=s,w=o,k=r,R=_;g;)switch(h=v,v=F()){case 40:if(108!=h&&58==S(R,d-1)){-1!=C(R+=x(H(v),"&","&\f"),"&\f")&&(y=-1);break}case 34:case 39:case 91:R+=H(v);break;case 9:case 10:case 13:case 32:R+=G(h);break;case 92:R+=V(q()-1,7);continue;case 47:switch(z()){case 42:case 47:T(se(Q(F(),q()),t,n,l),l);break;default:R+="/"}break;case 123*m:a[c++]=E(R)*y;case 125*m:case 59:case 0:switch(v){case 0:case 125:g=0;case 59+u:-1==y&&(R=x(R,/\f/g,"")),f>0&&E(R)-d&&T(f>32?oe(R+";",r,n,d-1,l):oe(x(R," ","")+";",r,n,d-2,l),l);break;case 59:R+=";";default:if(T(k=re(R,t,n,c,u,s,a,_,A=[],w=[],d,o),o),123===v)if(0===u)ne(R,t,k,k,A,o,d,a,w);else switch(99===p&&110===S(R,3)?100:p){case 100:case 108:case 109:case 115:ne(e,k,k,r&&T(re(e,k,k,0,0,s,a,_,s,A=[],d,w),w),s,w,d,a,r?A:w);break;default:ne(R,k,k,k,[""],w,0,a,w)}}c=u=f=0,m=y=1,_=R="",d=i;break;case 58:d=1+E(R),f=h;default:if(m<1)if(123==v)--m;else if(125==v&&0==m++&&125==(L=j>0?S(D,--j):0,O--,10===L&&(O=1,P--),L))continue;switch(R+=b(v),v*m){case 38:y=u>0?1:(R+="\f",-1);break;case 44:a[c++]=(E(R)-1)*y,y=1;break;case 64:45===z()&&(R+=H(F())),p=z(),u=d=E(_=R+=K(q())),v++;break;case 45:45===h&&2==E(R)&&(m=0)}}return o}function re(e,t,n,r,s,o,i,a,l,c,u,d){for(var p=s-1,h=0===s?o:[""],m=R(h),g=0,y=0,b=0;g0?h[_]+" "+w:x(w,/&\f/g,h[_])))&&(l[b++]=C);return U(e,t,n,0===s?f:a,l,c,u,d)}function se(e,t,n,r){return U(e,t,n,p,b(L),k(e,2,-2),0,r)}function oe(e,t,n,r,s){return U(e,t,n,h,k(e,0,r),k(e,r+1,-1),r,s)}const ie={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var ae="undefined"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",le="undefined"!=typeof window&&"HTMLElement"in window,ce=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY&&"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY),ue=(new Set,Object.freeze([])),de=Object.freeze({}),pe=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),fe=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,he=/(^-|-$)/g;function me(e){return e.replace(fe,"-").replace(he,"")}var ge=/(a)(d)/gi,ye=function(e){return String.fromCharCode(e+(e>25?39:97))};function ve(e){var t,n="";for(t=Math.abs(e);t>52;t=t/52|0)n=ye(t%52)+n;return(ye(t%52)+n).replace(ge,"$1-$2")}var be,_e=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},Ae=function(e){return _e(5381,e)};function we(e){return"string"==typeof e&&!0}var xe="function"==typeof Symbol&&Symbol.for,Ce=xe?Symbol.for("react.memo"):60115,Se=xe?Symbol.for("react.forward_ref"):60112,ke={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Ee={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Re={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},Te=((be={})[Se]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},be[Ce]=Re,be);function Ie(e){return("type"in(t=e)&&t.type.$$typeof)===Ce?Re:"$$typeof"in e?Te[e.$$typeof]:ke;var t}var Pe=Object.defineProperty,Oe=Object.getOwnPropertyNames,Ne=Object.getOwnPropertySymbols,je=Object.getOwnPropertyDescriptor,Le=Object.getPrototypeOf,De=Object.prototype;function Ue(e,t,n){if("string"!=typeof t){if(De){var r=Le(t);r&&r!==De&&Ue(e,r,n)}var s=Oe(t);Ne&&(s=s.concat(Ne(t)));for(var o=Ie(e),i=Ie(t),a=0;a0?" Args: ".concat(t.join(", ")):""))}var Ge=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}return e.prototype.indexOfGroup=function(e){for(var t=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,r=n.length,s=r;e>=s;)if((s<<=1)<0)throw He(16,"".concat(e));this.groupSizes=new Uint32Array(s),this.groupSizes.set(n),this.length=s;for(var o=r;o=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],r=this.indexOfGroup(e),s=r+n,o=r;o=0){var n=document.createTextNode(t);return this.element.insertBefore(n,this.nodes[e]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},e.prototype.getRule=function(e){return e0&&(l+="".concat(e,","))})),r+="".concat(i).concat(a,'{content:"').concat(l,'"}').concat("/*!sc*/\n")},o=0;o0?".".concat(t):e},u=l.slice();u.push((function(e){e.type===f&&e.value.includes("&")&&(e.props[0]=e.props[0].replace(ut,n).replace(r,c))})),i.prefix&&u.push(ee),u.push(X);var d=function(e,s,o,a){void 0===s&&(s=""),void 0===o&&(o=""),void 0===a&&(a="&"),t=a,n=s,r=new RegExp("\\".concat(n,"\\b"),"g");var l=e.replace(dt,""),c=te(o||s?"".concat(o," ").concat(s," { ").concat(l," }"):l);i.namespace&&(c=pt(c,i.namespace));var d,p,f,h=[];return J(c,(d=u.concat((f=function(e){return h.push(e)},function(e){e.root||(e=e.return)&&f(e)})),p=R(d),function(e,t,n,r){for(var s="",o=0;o="A"&&e<="Z"};function wt(e){for(var t="",n=0;n>>0);if(!t.hasNameForId(this.componentId,o)){var i=n(s,".".concat(o),void 0,this.componentId);t.insertRules(this.componentId,o,i)}r=Fe(r,o),this.staticRulesId=o}else{for(var a=_e(this.baseHash,n.hash),l="",c=0;c>>0);t.hasNameForId(this.componentId,p)||t.insertRules(this.componentId,p,n(l,".".concat(p),void 0,this.componentId)),r=Fe(r,p)}}return r},e}(),Tt=i().createContext(void 0);Tt.Consumer;var It={};function Pt(e,t,n){var s=Be(e),a=e,l=!we(e),c=t.attrs,u=void 0===c?ue:c,d=t.componentId,p=void 0===d?function(e,t){var n="string"!=typeof e?"sc":me(e);It[n]=(It[n]||0)+1;var r="".concat(n,"-").concat(function(e){return ve(Ae(e)>>>0)}("6.1.1"+n+It[n]));return t?"".concat(t,"-").concat(r):r}(t.displayName,t.parentComponentId):d,f=t.displayName,h=void 0===f?function(e){return we(e)?"styled.".concat(e):"Styled(".concat(function(e){return e.displayName||e.name||"Component"}(e),")")}(e):f,m=t.displayName&&t.componentId?"".concat(me(t.displayName),"-").concat(t.componentId):t.componentId||p,g=s&&a.attrs?a.attrs.concat(u).filter(Boolean):u,y=t.shouldForwardProp;if(s&&a.shouldForwardProp){var v=a.shouldForwardProp;if(t.shouldForwardProp){var b=t.shouldForwardProp;y=function(e,t){return v(e,t)&&b(e,t)}}else y=v}var _=new Rt(n,m,s?a.componentStyle:void 0);function A(e,t){return function(e,t,n){var s=e.attrs,a=e.componentStyle,l=e.defaultProps,c=e.foldedComponentIds,u=e.styledComponentId,d=e.target,p=i().useContext(Tt),f=vt(),h=e.shouldForwardProp||f.shouldForwardProp,m=function(e,t,n){for(var s,o=r(r({},t),{className:void 0,theme:n}),i=0;i2&&ct.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,r)}}(),function(){function e(){var e=this;this._emitSheetCSS=function(){var t=e.instance.toString(),n=nt(),r=ze([n&&'nonce="'.concat(n,'"'),"".concat(ae,'="true"'),"".concat("data-styled-version",'="').concat("6.1.1",'"')].filter(Boolean)," ");return"")},this.getStyleTags=function(){if(e.sealed)throw He(2);return e._emitSheetCSS()},this.getStyleElement=function(){var t;if(e.sealed)throw He(2);var n=((t={})[ae]="",t["data-styled-version"]="6.1.1",t.dangerouslySetInnerHTML={__html:e.instance.toString()},t),s=nt();return s&&(n.nonce=s),[i().createElement("style",r({},n,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new ct({isServer:!0}),this.sealed=!1}e.prototype.collectStyles=function(e){if(this.sealed)throw He(2);return i().createElement(bt,{sheet:this.instance},e)},e.prototype.interleaveWithNodeStream=function(e){throw He(3)}}(),"__sc-".concat(ae,"__")},4928:(e,t,n)=>{"use strict";n.d(t,{default:()=>d});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(7720);const l=i.cp.div` + height: auto; + width: 100%; +`,c=({src:e})=>(0,r.jsx)(l,{children:(0,r.jsx)("audio",{className:"edit-audio-preview",controls:!0,src:e})});c.propTypes={src:o().string.isRequired};const u=({className:e,onReset:t,onUpdate:n,onUpdateURL:s,value:o,valueURL:i})=>(0,r.jsx)(a.MediaPicker,{allowedTypes:["audio"],className:e,icon:"format-audio",onReset:t,onUpdate:n,onUpdateURL:s,preview:c,value:o,valueURL:i});u.defaultProps={className:"",onUpdateURL:null,valueURL:""},u.propTypes={className:o().string,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,value:o().number.isRequired,valueURL:o().string};const d=u},2312:(e,t,n)=>{"use strict";n.d(t,{default:()=>l});var r=n(7e3),s=n(900),o=n.n(s),i=n(7287);const a=({label:e,value:t,options:n,onChange:s})=>(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.BaseControl,{label:e}),n.map((e=>(0,r.jsx)(i.CheckboxControl,{label:e.label,checked:t.includes(e.value),onChange:n=>{s(n?[...t,e.value]:[...t.filter((t=>t!==e.value))])}})))]});a.propTypes={label:o().string.isRequired,value:o().arrayOf(o().string).isRequired,options:o().arrayOf(o().shape({label:o().string.isRequired,value:o().string.isRequired})).isRequired,onChange:o().func.isRequired};const l=a},8312:(e,t,n)=>{"use strict";n.d(t,{default:()=>u});var r=n(7e3),s=n(1280),o=n.n(s),i=n(3396),a=n(900),l=n.n(a),c=n(5328);class u extends o().PureComponent{static handleSubmit(e){e.preventDefault()}constructor(e){super(e),this.handleChange=this.handleChange.bind(this),this.state={error:"",success:""}}handleChange(e){const{attributeName:t,callback:n,setAttributes:r}=this.props;e.target.files&&e.target.files[0]&&(0,c.parseCSVFile)(e.target.files[0]).then((e=>n?n(e):e)).then((e=>{Array.isArray(e)&&e.length>0?(this.setState({error:"",success:(0,i.__)("Successfully read CSV data.","alley-scripts")}),r({[t]:JSON.stringify(e)})):this.setState({error:(0,i.__)("Could not map CSV data. Please check the source file to ensure that it has the correct structure.","alley-scripts"),success:""})})).catch((e=>{this.setState({error:e,success:""})}))}render(){const{error:e="",success:t=""}=this.state;return(0,r.jsxs)("div",{className:"alley-scripts-block-csv-uploader",children:[(0,r.jsx)("h2",{children:(0,i.__)("Upload CSV","alley-scripts")}),(0,r.jsxs)("form",{onSubmit:this.handleSubmit,children:[""!==e?(0,r.jsxs)("div",{style:{color:"#c00"},children:[(0,r.jsx)("strong",{children:(0,i.__)("Error:","alley-scripts")})," ",e]}):null,""!==t?(0,r.jsxs)("div",{style:{color:"#0c0"},children:[(0,r.jsx)("strong",{children:(0,i.__)("Success:","alley-scripts")})," ",t]}):null,(0,r.jsx)("div",{children:(0,r.jsxs)("label",{htmlFor:"alley-scripts-block-csv-uploader-file",children:[(0,r.jsx)("p",{children:(0,i.__)("Select a file to load data.","alley-scripts")}),(0,r.jsx)("input",{id:"alley-scripts-block-csv-uploader-file",onChange:this.handleChange,type:"file"})]})})]})]})}}u.defaultProps={callback:null},u.propTypes={attributeName:l().string.isRequired,callback:l().func,setAttributes:l().func.isRequired}},8348:(e,t,n)=>{"use strict";n.d(t,{default:()=>p});var r=n(7e3),s=n(3396),o=n(900),i=n.n(o),a=n(3376),l=n(7720);const c=a.cp.div` + box-sizing: border-box; + flex-shrink: 0; + height: auto; + max-height: 1450px; + max-width: 1450px; + min-height: 20px; + min-width: 20px; + position: relative; + width: auto; +`,u=({src:e})=>(0,r.jsx)(c,{children:(0,r.jsx)("img",{alt:(0,s.__)("Edit image","alley-scripts"),className:"edit-image-preview",src:e,title:(0,s.__)("Edit image","alley-scripts")})});u.propTypes={src:i().string.isRequired};const d=({className:e,imageSize:t,displayControlsInToolbar:n,onReset:s,onUpdate:o,onUpdateURL:i,value:a,valueURL:c})=>(0,r.jsx)(l.MediaPicker,{allowedTypes:["image"],className:e,icon:"format-image",imageSize:t,displayControlsInToolbar:n,onReset:s,onUpdate:o,onUpdateURL:i,preview:u,value:a,valueURL:c});d.defaultProps={className:"",imageSize:"thumbnail",displayControlsInToolbar:!1,onUpdateURL:null,valueURL:""},d.propTypes={className:i().string,imageSize:i().string,displayControlsInToolbar:i().bool,onReset:i().func.isRequired,onUpdate:i().func.isRequired,onUpdateURL:i().func,value:i().number.isRequired,valueURL:i().string};const p=d},7720:(e,t,n)=>{"use strict";n.d(t,{AudioPicker:()=>r.default,CSVUploader:()=>o.default,Checkboxes:()=>s.default,ImagePicker:()=>i.default,MediaPicker:()=>a.default,PostPicker:()=>c.default,PostSelector:()=>u.default,SafeHtml:()=>l.default,Selector:()=>d.default,Sortable:()=>p.default,SortableItem:()=>f.default,TermSelector:()=>h.default,VideoPicker:()=>m.default});var r=n(4928),s=n(2312),o=n(8312),i=n(8348),a=n(5680),l=n(9160),c=n(4808),u=n(8800),d=n(9064),p=n(8504),f=n(1917),h=n(668),m=n(5316)},5680:(e,t,n)=>{"use strict";n.d(t,{default:()=>m});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(9528),l=n(7287),c=n(7752),u=n(3396),d=n(5328);const p=i.cp.div` + display: block; + position: relative; +`,f=i.cp.div` + background: white; + border: 1px solid black; + padding: 1em; +`,h=({allowedTypes:e,className:t,icon:n,imageSize:s,displayControlsInToolbar:o,onReset:i,onUpdate:h,onUpdateURL:m,preview:g,value:y,valueURL:v})=>{const{media:b}=(0,c.useSelect)((e=>({media:y?e("core").getMedia(y):void 0})),[y]);if(0!==y&&null===b)return(0,r.jsx)(l.Spinner,{});const _=b?(0,d.getMediaUrl)(b,s):v;return _?(0,r.jsxs)(p,{className:t,children:[g?(0,r.jsx)(g,{src:_}):(0,r.jsxs)(f,{className:"alley-scripts-media-picker__preview",children:[(0,r.jsx)("p",{children:(0,u.__)("Selected file:","alley-scripts")}),(0,r.jsx)("p",{children:(0,r.jsx)("a",{href:_,children:_})})]}),o?(0,r.jsx)(a.BlockControls,{group:"other",children:(0,r.jsx)(a.MediaReplaceFlow,{name:(0,u.__)("Edit Media","alley-scripts"),mediaId:y,mediaURL:_,allowedTypes:e,onSelect:h,onSelectURL:m,children:(0,r.jsx)(l.ToolbarButton,{isDestructive:!0,text:(0,u.__)("Remove","alley-scripts"),onClick:i})})}):(0,r.jsx)(l.Button,{variant:"primary",onClick:i,children:(0,u.__)("Reset","alley-scripts")})]}):(0,r.jsx)(p,{className:t,children:(0,r.jsx)(a.MediaPlaceholder,{allowedTypes:e,disableMediaButtons:!!v,icon:(0,r.jsx)(a.BlockIcon,{icon:n}),onSelect:h,onSelectURL:m,value:{id:y,src:_}})})};h.defaultProps={allowedTypes:[],className:"",icon:"format-aside",imageSize:"thumbnail",displayControlsInToolbar:!1,onUpdateURL:null,preview:null,valueURL:""},h.propTypes={allowedTypes:o().arrayOf(o().string),className:o().string,icon:o().string,imageSize:o().string,displayControlsInToolbar:o().bool,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,preview:o().element,value:o().number.isRequired,valueURL:o().string};const m=h},4808:(e,t,n)=>{"use strict";n.d(t,{default:()=>F});var r=n(7e3),s=n(1280),o=n(3376),i=n(7287),a=n(3396),l=n(7204),c=n(2e3),u=n(2108),d=n.n(u),p=n(7020),f=n.n(p),h=n(7240),m=n.n(h),g=n(9516),y=n.n(g),v=n(2940),b=n.n(v),_=n(9296),A=n.n(_),w=n(9680),x={};x.styleTagTransform=A(),x.setAttributes=y(),x.insert=m().bind(null,"head"),x.domAPI=f(),x.insertStyleElement=b(),d()(w.c,x),w.c&&w.c.locals&&w.c.locals;var C=n(4632),S=n.n(C),k=n(6484),E=n.n(k),R=n(7424),T={};T.styleTagTransform=A(),T.setAttributes=y(),T.insert=m().bind(null,"head"),T.domAPI=f(),T.insertStyleElement=b(),d()(R.c,T),R.c&&R.c.locals&&R.c.locals;const I=window.wp.htmlEntities;var P=n(9160);const O=o.cp.div` + align-items: center; + gap: 4px; + overflow-wrap: anywhere; + display: flex; + flex-direction: column; + justify-content: center; + padding: 0.5rem 0.75rem; +`,N=({title:e,postType:t,attachmentID:n})=>{const s=(0,c.useMedia)(n),o=s?.media_details?.sizes?.thumbnail?.source_url,i=s?.alt_text??"";return(0,r.jsxs)(O,{children:[o?(0,r.jsx)("img",{style:{maxWidth:"100%",height:"auto"},loading:"lazy",src:o,alt:i}):null,(0,r.jsx)(P.default,{html:(0,I.decodeEntities)(e),className:"post-picker-result-title",tag:"strong"}),(0,a.sprintf)(" (%s)",t)]})},j=({baseUrl:e,searchRender:t,selected:n,setSelected:o,suppressPostIds:c=[]})=>{const[u,d]=(0,s.useState)(!1),[p,f]=(0,s.useState)([]),[h,m]=(0,s.useState)(!1),[g,y]=(0,s.useState)(0),[v,b]=(0,s.useState)({searchValue:"",page:1}),_=(0,s.useCallback)((async(t,n=!1)=>{if(t.searchValue&&t.searchValue.length<=2)return;const r=function(){let n=(0,l.addQueryArgs)(e,{page:t.page,_embed:1,exclude:c.join(",")});return t.searchValue&&t.searchValue.length>2&&(n=(0,l.addQueryArgs)(n,{search:t.searchValue})),n}();d(!0);const s=await S()({path:r,parse:!1});y(parseInt(s.headers.get("X-WP-TotalPages"),10));const o=await s.json();let i=o;t.page>1&&(i=[...p,...o]),n||(f(i),d(!1))}),[p,e,c]);return(0,s.useEffect)((()=>{let e=!1;return h||(m(!0),_(v,e)),()=>{e=!0}}),[_,h,v]),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.TextControl,{value:v.searchValue,placeholder:(0,a.__)("Search...","alley-scripts"),label:(0,a.__)("Search","alley-scripts"),onChange:e=>{const t={...v,searchValue:e,page:1};b(t),_(t)}}),(0,r.jsxs)("div",{className:"alley-scripts-post-picker__post-list",children:[p?p.map((e=>(0,r.jsx)(i.Button,{className:E()({"alley-scripts-post-picker__post":!0,"is-selected":e.id===n}),onClick:()=>o(e.id),children:t?t(e):(0,r.jsx)(N,{title:e.title,postType:e.subtype,attachmentID:e?._embedded?.self[0]?.featured_media})},e.id))):null,u?(0,r.jsx)(i.Spinner,{}):null,g>0&&v.page{const e={...v,page:v.page+1};b(e),_(e)},children:(0,a.__)("Load More","alley-scripts")})}):null]})]})},L=({baseUrl:e,closeModal:t,modalTitle:n,onUpdate:o,searchRender:l,suppressPostIds:c=[]})=>{const[u,d]=(0,s.useState)();return(0,r.jsxs)(i.Modal,{className:"alley-scripts-post-picker__modal",isDismissible:!0,title:n,onRequestClose:t,closeButtonLabel:"Close",children:[(0,r.jsx)(j,{baseUrl:e,selected:u??0,setSelected:d,searchRender:l,suppressPostIds:c}),(0,r.jsxs)("div",{className:"alley-scripts-post-picker__buttons",children:[(0,r.jsx)(i.Button,{variant:"secondary",onClick:t,children:(0,a.__)("Cancel","alley-scripts")}),(0,r.jsx)(i.Button,{variant:"primary",onClick:()=>{u&&(o(u),t())},disabled:!u,children:(0,a.__)("Select","alley-scripts")})]})]})};var D=n(3800),U={};U.styleTagTransform=A(),U.setAttributes=y(),U.insert=m().bind(null,"head"),U.domAPI=f(),U.insertStyleElement=b(),d()(D.c,U),D.c&&D.c.locals&&D.c.locals;const M=o.cp.div` + display: block; + position: relative; +`,B=o.cp.div` + border: 1px solid #eee; + display: flex; + flex-direction: column; + margin: 5px 0; + padding: 0.5rem 0.75rem; + text-align: center; +`,F=({allowedTypes:e,className:t,getPostType:n,modalTitle:o=(0,a.__)("Select Post","alley-scripts"),onReset:u,onUpdate:d,params:p={},previewLookup:f,previewRender:h,replaceText:m=(0,a.__)("Replace","alley-scripts"),resetText:g=(0,a.__)("Reset","alley-scripts"),searchEndpoint:y="/wp/v2/search",searchRender:v,selectText:b=(0,a.__)("Select","alley-scripts"),suppressPostIds:_=[],title:A="",value:w=0})=>{const[x,C]=(0,s.useState)(!1),S=(0,l.addQueryArgs)(y,{type:"post",subtype:e??"any",...p}),k=f?f(w):(0,c.usePostById)(w,n),{featured_media:E,title:{rendered:R=""}={},type:T=""}=k||{},I=()=>{C(!0)},P=()=>(0,r.jsxs)(i.ButtonGroup,{children:[(0,r.jsx)(i.Button,{variant:"secondary",onClick:u,style:{margin:"0 4px"},children:g}),(0,r.jsx)(i.Button,{variant:"secondary",onClick:I,style:{margin:"0 4px"},children:m})]});return 0!==w&&null===k?(0,r.jsx)(i.Spinner,{}):(0,r.jsxs)(M,{className:t,children:[A?(0,r.jsx)("h4",{children:A}):null,0!==w&&void 0===k?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.Notice,{status:"error",isDismissible:!1,className:"post-picker-notice",children:(0,r.jsx)("p",{children:(0,a.sprintf)((0,a.__)("Post %d is no longer available; it has been unpublished or deleted","alley-scripts"),w)})}),P()]}):null,0!==w&&void 0!==k?(0,r.jsxs)(r.Fragment,{children:[void 0!==h?h(k):(0,r.jsx)(B,{children:(0,r.jsx)(N,{title:R,postType:T,attachmentID:E})}),P()]}):null,0===w?(0,r.jsx)(i.Button,{onClick:I,variant:"secondary",children:b}):null,x?(0,r.jsx)(L,{closeModal:()=>{C(!1)},baseUrl:S,modalTitle:o,onUpdate:d,searchRender:v,suppressPostIds:_}):null]})}},8800:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(900),o=n.n(s),i=n(3396),a=n(7720);const l=({className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d})=>(0,r.jsx)(a.Selector,{type:"post",className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d});l.defaultProps={className:"",emptyLabel:(0,i.__)("No posts found","alley-scripts"),label:(0,i.__)("Search for posts","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,i.__)("Search for posts","alley-scripts"),subTypes:[],selected:[],threshold:3},l.propTypes={className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const c=l},9160:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(6595),o=n.n(s),i=n(900),a=n.n(i);const l=({className:e,html:t,tag:n})=>(0,r.jsx)(n,{className:e,dangerouslySetInnerHTML:{__html:o().sanitize(t)}});l.defaultProps={className:""},l.propTypes={className:a().string,html:a().string.isRequired,tag:a().string.isRequired};const c=l},9064:(e,t,n)=>{"use strict";n.d(t,{default:()=>M});var r=n(7e3),s=n(900),o=n.n(s),i=n(1280),a=n(4632),l=n.n(a),c=n(6484),u=n.n(c),d=n(7287),p=n(3396),f=n(7204);const h={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let m;const g=new Uint8Array(16);function y(){if(!m&&(m="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!m))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(g)}const v=[];for(let e=0;e<256;++e)v.push((e+256).toString(16).slice(1));const b=function(e,t,n){if(h.randomUUID&&!t&&!e)return h.randomUUID();const r=(e=e||{}).random||(e.rng||y)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return function(e,t=0){return v[e[t+0]]+v[e[t+1]]+v[e[t+2]]+v[e[t+3]]+"-"+v[e[t+4]]+v[e[t+5]]+"-"+v[e[t+6]]+v[e[t+7]]+"-"+v[e[t+8]]+v[e[t+9]]+"-"+v[e[t+10]]+v[e[t+11]]+v[e[t+12]]+v[e[t+13]]+v[e[t+14]]+v[e[t+15]]}(r)};var _=n(2e3);const A=({emptyLabel:e,error:t,id:n,isOpen:s,labelledbyId:o,loading:i,onSelect:a,options:l,selectedItems:c,threshold:f,value:h})=>{if(!i&&(""===h||f>h.length))return null;let m="",g="";return i?(m="loading",g=(0,p.__)("Loading...","alley-scripts")):t?(m="error",g=t):i||0!==l.length||(m="no-posts",g=e),i||!i&&(h&&0===l.length||t)?(0,r.jsx)("div",{"aria-busy":!0,className:u()("autocomplete__dropdown",{"autocomplete__dropdown--is-open":s}),children:(0,r.jsx)("div",{className:u()("autocomplete__dropdown--notice",`autocomplete__${m}`),children:g})}):(0,r.jsx)("div",{className:u()("autocomplete__dropdown",{"autocomplete__dropdown--is-open":s}),children:(0,r.jsx)("ul",{role:"listbox","aria-labelledby":o,id:n,className:u()("autocomplete__dropdown--results","autocomplete__list"),children:l.map((e=>(0,r.jsx)("li",{className:"autocomplete__list--item",children:(0,r.jsx)(d.Button,{onClick:()=>a(e),type:"button",disabled:c.some((t=>t.id===e.id)),isTertiary:!0,children:e.title})},e.id)))})})};A.propTypes={emptyLabel:o().string.isRequired,error:o().string.isRequired,id:o().string.isRequired,isOpen:o().bool.isRequired,labelledbyId:o().string.isRequired,loading:o().bool.isRequired,options:o().arrayOf(o().shape({label:o().string,value:o().string})).isRequired,onSelect:o().func.isRequired,selectedItems:o().shape([]).isRequired,threshold:o().number.isRequired,value:o().string.isRequired};const w=A;var x=n(2108),C=n.n(x),S=n(7020),k=n.n(S),E=n(7240),R=n.n(E),T=n(9516),I=n.n(T),P=n(2940),O=n.n(P),N=n(9296),j=n.n(N),L=n(5500),D={};D.styleTagTransform=j(),D.setAttributes=I(),D.insert=R().bind(null,"head"),D.domAPI=k(),D.insertStyleElement=O(),C()(L.c,D),L.c&&L.c.locals&&L.c.locals;const U=({type:e,className:t,emptyLabel:n,label:s,maxPages:o,multiple:a,onSelect:c,placeholder:p,subTypes:h,selected:m,threshold:g})=>{const y=b(),[v,A]=(0,i.useState)(""),[x,C]=(0,i.useState)([]),[S,k]=(0,i.useState)(!1),[E,R]=(0,i.useState)(!1),[T,I]=(0,i.useState)(""),[P,O]=(0,i.useState)([]),N=(0,i.useRef)(),j=(0,_.useDebounce)(T,750),L=(0,i.useCallback)((async(t=1)=>{if(j.length0?h.join(","):"any",type:e});await l()({path:r,parse:!1}).then((e=>{const t=parseInt(e.headers.get("X-WP-TotalPages"),10);return n=t>o?o:t,e.json()})).then((e=>{C((t=>[...t,...e])),R(!1),(n&&n>t||t>=1&&a&&P.length>0)&&L(t+1)})).catch((e=>A(e.message)))}),[j,e,o,a,h,P.length,g]);(0,i.useEffect)((()=>{O(m)}),[m]),(0,i.useEffect)((()=>{j&&g<=j.length?L():C([])}),[j,L,g]);const D=e=>{k(N.current.contains(e.target))},U=e=>{"Escape"===e.key&&k(!1)};(0,i.useEffect)((()=>(document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)))),(0,i.useEffect)((()=>(N&&document.addEventListener("mousedown",D),()=>document.removeEventListener("mousedown",D))));const M=e=>{let t=[];if(P.some((t=>t.id===e.id))){const n=P.findIndex((t=>t.id===e.id));t=[...P.slice(0,n),...P.slice(n+1,P.length)]}else a?t=[...P,e]:(t=[e],k(!1));O(t),c(t)};return(0,r.jsx)("form",{className:"autocomplete__component",onSubmit:e=>e.preventDefault(),children:(0,r.jsxs)("div",{className:u()("components-base-control","autocomplete-base-control",t),ref:N,children:[(0,r.jsxs)("div",{"aria-expanded":S,"aria-haspopup":"listbox","aria-owns":`listbox-${y}`,className:u()("components-base-control__field","autocomplete-base-control__field"),role:"combobox",children:[(0,r.jsx)("label",{className:u()("components-base-control__label","autocomplete-base-control__label"),htmlFor:`autocomplete-${y}`,children:(0,r.jsx)("div",{children:s})}),P.length>0?(0,r.jsx)("ul",{role:"listbox","aria-labelledby":`autocomplete-${y}`,id:`selected-items-${y}`,className:u()("autocomplete__selection--results","autocomplete__selection-list"),children:P.map((e=>(0,r.jsx)("li",{className:"autocomplete__selection-list--item",children:(0,r.jsx)(d.Button,{className:"autocomplete__selection-list--item--button",isSecondary:!0,isSmall:!0,onClick:()=>M(e),type:"button",children:e.title})},e.title)))}):null,(0,r.jsx)("input",{"aria-autocomplete":"list",autoComplete:"off",className:u()("components-text-control__input","autocomplete-text-control__input",{"autocomplete-text-control__input--working":S}),id:`autocomplete-${y}`,onChange:e=>I(e.target.value),onFocus:()=>k(!0),placeholder:p,type:"text",value:T})]}),(0,r.jsx)(w,{emptyLabel:n,error:v,labelledById:`autocomplete-${y}`,id:`listbox-${y}`,isOpen:S,loading:E&&j,onSelect:M,options:x,selectedItems:P,threshold:g,value:j})]})})};U.defaultProps={type:"post",className:"",emptyLabel:(0,p.__)("No items found","alley-scripts"),label:(0,p.__)("Search for items","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,p.__)("Search for items","alley-scripts"),subTypes:[],selected:[],threshold:3},U.propTypes={type:o().string,className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const M=U},1917:(e,t,n)=>{"use strict";n.d(t,{default:()=>i});var r=n(7e3),s=n(7287),o=n(3396);function i({children:e,index:t,list:n,setList:i}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(s.Button,{disabled:0===t,icon:"arrow-up-alt2",label:(0,o.__)("Move up","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t-1,0,e.splice(t,1)[0]),i(e)}}),(0,r.jsx)(s.Button,{disabled:t===n.length-1,icon:"arrow-down-alt2",label:(0,o.__)("Move down","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t+1,0,e.splice(t,1)[0]),i(e)}}),(0,r.jsx)(s.Button,{icon:"trash",label:(0,o.__)("Remove","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t,1),i(e)}})]}),(0,r.jsx)("div",{children:e})]})}},8504:(e,t,n)=>{"use strict";n.d(t,{default:()=>i});var r=n(7e3),s=n(7287),o=n(3396);function i({children:e,emptyItem:t,list:n,setList:i}){return(0,r.jsxs)(r.Fragment,{children:[e,(0,r.jsx)("div",{style:{margin:"1em 0"},children:(0,r.jsx)(s.Button,{icon:"plus",onClick:()=>i([...n,t]),variant:"primary",children:(0,o.__)("Add Item","alley-scripts")})})]})}},668:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(900),o=n.n(s),i=n(3396),a=n(7720);const l=({className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d})=>(0,r.jsx)(a.Selector,{type:"term",className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d});l.defaultProps={className:"",emptyLabel:(0,i.__)("No terms found","alley-scripts"),label:(0,i.__)("Search for terms","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,i.__)("Search for terms","alley-scripts"),subTypes:[],selected:[],threshold:3},l.propTypes={className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const c=l},5316:(e,t,n)=>{"use strict";n.d(t,{default:()=>d});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(7720);const l=i.cp.div` + height: auto; + width: 100%; +`,c=({src:e})=>(0,r.jsx)(l,{children:(0,r.jsx)("video",{className:"edit-video-preview",controls:!0,src:e})});c.propTypes={src:o().string.isRequired};const u=({className:e,onReset:t,onUpdate:n,onUpdateURL:s,value:o,valueURL:i})=>(0,r.jsx)(a.MediaPicker,{allowedTypes:["video"],className:e,icon:"format-video",onReset:t,onUpdate:n,onUpdateURL:s,preview:c,value:o,valueURL:i});u.defaultProps={className:"",onUpdateURL:null,valueURL:""},u.propTypes={className:o().string,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,value:o().number.isRequired,valueURL:o().string};const d=u},2e3:(e,t,n)=>{"use strict";n.d(t,{useCurrentPostId:()=>r.default,useCurrentTheme:()=>s.default,useDebounce:()=>o.default,useHasInnerBlocks:()=>i.default,useInnerBlocks:()=>a.default,useInnerBlocksAttributes:()=>l.default,useInnerBlocksCount:()=>c.default,useInnerBlocksIndex:()=>u.default,useMedia:()=>d.default,useOption:()=>p.default,useParentBlock:()=>f.default,useParentBlockAttributes:()=>h.default,usePost:()=>m.default,usePostById:()=>g.default,usePostMeta:()=>y.default,usePostMetaValue:()=>v.default,usePosts:()=>b.default,usePreviewLink:()=>_.default,useTerm:()=>A.default,useTerms:()=>w.default});var r=n(9695),s=n(5904),o=n(7112),i=n(6980),a=n(864),l=n(8512),c=n(1344),u=n(6644),d=n(592),p=n(7188),f=n(224),h=n(8004),m=n(1744),g=n(9480),y=n(6504),v=n(3772),b=n(4704),_=n(7532),A=n(7712),w=n(1848)},9695:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>{const t=e("core/editor");return t?t.getCurrentPostId():null}),[])},5904:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>{const t=e("core");return t?t.getCurrentTheme()?.stylesheet:null}),[])},7112:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(1280);const s=(e,t)=>{const[n,s]=(0,r.useState)(e);return(0,r.useEffect)((()=>{const n=setTimeout((()=>{s(e)}),t);return()=>{clearTimeout(n)}}),[e,t]),n}},6980:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocksCount)(e)>0},6644:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>{const t=(0,r.useParentBlock)(e),n=(0,r.useInnerBlocks)(t);return n?n.findIndex((t=>t.clientId===e)):-1}},8512:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocks)(e).map((e=>e.attributes))},1344:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocks)(e).length},864:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>t(r.store).getBlocks(e)),[e])},592:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=e=>(0,r.useSelect)((t=>t("core").getMedia(e)),[e])},7188:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=function(e){const t=(0,r.useSelect)((t=>{const{getEditedEntityRecord:n,getEntityRecordEdits:r,isSavingEntityRecord:s}=t("core"),o=n("root","site"),i=r("root","site");return{value:o?.[e],isEdited:!!i?.[e],isSaving:s("root","site")}}),[]),{editEntityRecord:n,saveEntityRecord:s}=(0,r.useDispatch)("core");return{...t,onChange:function(t){n("root","site",void 0,{[e]:t})},onSave:async function(){await s("root","site",{[e]:t.value})}}}},8004:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>{const{getBlockAttributes:n,getBlockRootClientId:s}=t(r.store),o=s(e);return o?n(o):null}),[e])},224:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>{const{getBlock:n,getBlockRootClientId:s}=t(r.store),o=s(e);return o?n(o):null}),[e])},9480:(e,t,n)=>{"use strict";n.d(t,{default:()=>l});var r=n(1280),s=n(4632),o=n.n(s),i=n(7204),a=n(1744);const l=(e,t=null,n={context:"view"})=>{const[s,l]=(0,r.useState)({}),[c,u]=(0,r.useState)(!0);(0,r.useEffect)((()=>{u(!0),e&&!s[e]?(async()=>{if(t){const n=await t(e);n?l((t=>({...t,[e]:n}))):console.error(`Custom function to get post with ID ${e} failed.`)}else{const t=(0,i.addQueryArgs)("/wp/v2/search",{include:e}),n=await o()({path:t});n.length>0&&l((t=>({...t,[e]:n[0]?.subtype})))}u(!1)})():e&&s[e]&&u(!1)}),[e]);const d=(0,a.default)(e,s[e]??"",n);return c||!d&&s[e]?null:d}},3772:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=(e,t=null,n=null)=>{const[s,o]=(0,r.usePostMeta)(t,n);return[s[e],t=>o({...s,[e]:t})]}},6504:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(3048),s=n(7752);const o=(e=null,t=null)=>{const n=(0,s.useSelect)((t=>e||t("core/editor").getCurrentPostType()),[]),[o,i]=(0,r.useEntityProp)("postType",n,"meta",t),a="function"==typeof i?i:()=>console.error(`Error attempting to set post meta for post type ${n}. Does it have support for custom-fields?`);return["object"==typeof o?o:{},e=>a({...e})]}},1744:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="post",n={context:"view"})=>(0,r.useSelect)((r=>r("core").getEntityRecord("postType",t,e,n)),[e,t])},4704:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="post")=>(0,r.useSelect)((n=>{const{getEntityRecords:r}=n("core");return r("postType",t,{include:e})}),[e,t])},7532:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>e("core").getEditedPostPreviewLink()),[])},7712:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="category",n={context:"view"})=>(0,r.useSelect)((r=>r("core").getEntityRecord("taxonomy",t,e,n)),[e,t])},1848:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(3048),s=n(7752);const o=(e=null,t=null,n="categories")=>{const o=(0,s.useSelect)((t=>e||t("core/editor").getCurrentPostType()),[]),[i,a]=(0,r.useEntityProp)("postType",o,n,t);return[i,e=>a(e)]}},5328:(e,t,n)=>{"use strict";n.d(t,{getMediaUrl:()=>i.c,parseCSVFile:()=>o});var r=n(2232),s=n.n(r);const o=e=>new Promise(((t,n)=>{s().parse(e,{complete:e=>t(e.data),dynamicTyping:!0,error:e=>n(e),header:!0,skipEmptyLines:!0})}));var i=n(6199)},6199:(e,t,n)=>{"use strict";n.d(t,{c:()=>r});const r=(e,t="full")=>{const{media_details:{sizes:{[t]:{source_url:n=""}={},full:{source_url:r=""}={}}={}}={},sizes:{[t]:{url:s=""}={},full:{url:o=""}={}}={},source_url:i="",url:a=""}=e;return s||n||o||r||a||i||""}},1280:e=>{"use strict";e.exports=window.React},4632:e=>{"use strict";e.exports=window.wp.apiFetch},9528:e=>{"use strict";e.exports=window.wp.blockEditor},7287:e=>{"use strict";e.exports=window.wp.components},3048:e=>{"use strict";e.exports=window.wp.coreData},7752:e=>{"use strict";e.exports=window.wp.data},3396:e=>{"use strict";e.exports=window.wp.i18n},7204:e=>{"use strict";e.exports=window.wp.url}},t={};function n(r){var s=t[r];if(void 0!==s)return s.exports;var o=t[r]={id:r,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var r={};return(()=>{"use strict";n.r(r),n.d(r,{AudioPicker:()=>e.AudioPicker,CSVUploader:()=>e.CSVUploader,Checkboxes:()=>e.Checkboxes,ImagePicker:()=>e.ImagePicker,MediaPicker:()=>e.MediaPicker,PostPicker:()=>e.PostPicker,PostSelector:()=>e.PostSelector,SafeHtml:()=>e.SafeHtml,Selector:()=>e.Selector,Sortable:()=>e.Sortable,SortableItem:()=>e.SortableItem,TermSelector:()=>e.TermSelector,VideoPicker:()=>e.VideoPicker,getMediaUrl:()=>s.getMediaUrl,parseCSVFile:()=>s.parseCSVFile,useCurrentPostId:()=>t.useCurrentPostId,useCurrentTheme:()=>t.useCurrentTheme,useDebounce:()=>t.useDebounce,useHasInnerBlocks:()=>t.useHasInnerBlocks,useInnerBlocks:()=>t.useInnerBlocks,useInnerBlocksAttributes:()=>t.useInnerBlocksAttributes,useInnerBlocksCount:()=>t.useInnerBlocksCount,useInnerBlocksIndex:()=>t.useInnerBlocksIndex,useMedia:()=>t.useMedia,useOption:()=>t.useOption,useParentBlock:()=>t.useParentBlock,useParentBlockAttributes:()=>t.useParentBlockAttributes,usePost:()=>t.usePost,usePostById:()=>t.usePostById,usePostMeta:()=>t.usePostMeta,usePostMetaValue:()=>t.usePostMetaValue,usePosts:()=>t.usePosts,usePreviewLink:()=>t.usePreviewLink,useTerm:()=>t.useTerm,useTerms:()=>t.useTerms});var e=n(7720),t=n(2e3),s=n(5328)})(),r})(),e.exports=t()},175:function(e,t,n){"use strict";var r=window.wp.blocks,s=window.wp.blockEditor,o=n(196),i=n(688);const a=()=>{},l=a(),c=Object,u=e=>e===l,d=e=>"function"==typeof e,p=(e,t)=>({...e,...t}),f=new WeakMap;let h=0;const m=e=>{const t=typeof e,n=e&&e.constructor,r=n==Date;let s,o;if(c(e)!==e||r||n==RegExp)s=r?e.toJSON():"symbol"==t?e.toString():"string"==t?JSON.stringify(e):""+e;else{if(s=f.get(e),s)return s;if(s=++h+"~",f.set(e,s),n==Array){for(s="@",o=0;o{const n=g.get(e);return[()=>!u(t)&&e.get(t)||y,r=>{if(!u(t)){const s=e.get(t);t in v||(v[t]=s),n[5](t,p(s,r),s||y)}},n[6],()=>!u(t)&&t in v?v[t]:!u(t)&&e.get(t)||y]};let x=!0;const[C,S]=_&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[a,a],k={isOnline:()=>x,isVisible:()=>{const e=A&&document.visibilityState;return u(e)||"hidden"!==e}},E={initFocus:e=>(A&&document.addEventListener("visibilitychange",e),C("focus",e),()=>{A&&document.removeEventListener("visibilitychange",e),S("focus",e)}),initReconnect:e=>{const t=()=>{x=!0,e()},n=()=>{x=!1};return C("online",t),C("offline",n),()=>{S("online",t),S("offline",n)}}},R=!o.useId,T=!_||"Deno"in window,I=T?o.useEffect:o.useLayoutEffect,P="undefined"!=typeof navigator&&navigator.connection,O=!T&&P&&(["slow-2g","2g"].includes(P.effectiveType)||P.saveData),N=e=>{if(d(e))try{e=e()}catch(t){e=""}const t=e;return[e="string"==typeof e?e:(Array.isArray(e)?e.length:e)?m(e):"",t]};let j=0;const L=()=>++j;async function D(...e){const[t,n,r,s]=e,o=p({populateCache:!0,throwOnError:!0},"boolean"==typeof s?{revalidate:s}:s||{});let i=o.populateCache;const a=o.rollbackOnError;let c=o.optimisticData;const f=o.throwOnError;if(d(n)){const e=n,r=[],s=t.keys();for(const n of s)!/^\$(inf|sub)\$/.test(n)&&e(t.get(n)._k)&&r.push(n);return Promise.all(r.map(h))}return h(n);async function h(n){const[s]=N(n);if(!s)return;const[p,h]=w(t,s),[m,y,v,b]=g.get(t),_=()=>{const e=m[s];return(d(o.revalidate)?o.revalidate(p().data,n):!1!==o.revalidate)&&(delete v[s],delete b[s],e&&e[0])?e[0](2).then((()=>p().data)):p().data};if(e.length<3)return _();let A,x=r;const C=L();y[s]=[C,0];const S=!u(c),k=p(),E=k.data,R=k._c,T=u(R)?E:R;if(S&&(c=d(c)?c(T,E):c,h({data:c,_c:T})),d(x))try{x=x(T)}catch(e){A=e}if(x&&d(x.then)){if(x=await x.catch((e=>{A=e})),C!==y[s][0]){if(A)throw A;return x}A&&S&&(e=>"function"==typeof a?a(e):!1!==a)(A)&&(i=!0,h({data:T,_c:l}))}if(i&&!A)if(d(i)){const e=i(x,T);h({data:e,error:l,_c:l})}else h({data:x,error:l,_c:l});if(y[s][1]=L(),Promise.resolve(_()).then((()=>{h({_c:l})})),!A)return x;if(f)throw A}}const U=(e,t)=>{for(const n in e)e[n][0]&&e[n][0](t)},M=(e,t)=>{if(!g.has(e)){const n=p(E,t),r={},s=D.bind(l,e);let o=a;const i={},c=(e,t)=>{const n=i[e]||[];return i[e]=n,n.push(t),()=>n.splice(n.indexOf(t),1)},u=(t,n,r)=>{e.set(t,n);const s=i[t];if(s)for(const e of s)e(n,r)},d=()=>{if(!g.has(e)&&(g.set(e,[r,{},{},{},s,u,c]),!T)){const t=n.initFocus(setTimeout.bind(l,U.bind(l,r,0))),s=n.initReconnect(setTimeout.bind(l,U.bind(l,r,1)));o=()=>{t&&t(),s&&s(),g.delete(e)}}};return d(),[e,s,d,o]}return[e,g.get(e)[4]]},[B,F]=M(new Map),z=p({onLoadingSlow:a,onSuccess:a,onError:a,onErrorRetry:(e,__,t,n,r)=>{const s=t.errorRetryCount,o=r.retryCount,i=~~((Math.random()+.5)*(1<<(o<8?o:8)))*t.errorRetryInterval;!u(s)&&o>s||setTimeout(n,i,r)},onDiscarded:a,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:O?1e4:5e3,focusThrottleInterval:5e3,dedupingInterval:2e3,loadingTimeout:O?5e3:3e3,compare:(e,t)=>m(e)==m(t),isPaused:()=>!1,cache:B,mutate:F,fallback:{}},k),q=(e,t)=>{const n=p(e,t);if(t){const{use:r,fallback:s}=e,{use:o,fallback:i}=t;r&&o&&(n.use=r.concat(o)),s&&i&&(n.fallback=p(s,i))}return n},$=(0,o.createContext)({}),W=_&&window.__SWR_DEVTOOLS_USE__,H=W?window.__SWR_DEVTOOLS_USE__:[],G=e=>d(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(null===e[1]?e[2]:e[1])||{}],V=H.concat((e=>(t,n,r)=>e(t,n&&((...e)=>{const[r]=N(t),[,,,s]=g.get(B);if(r.startsWith("$inf$"))return n(...e);const o=s[r];return u(o)?n(...e):(delete s[r],o)}),r)));W&&(window.__SWR_DEVTOOLS_REACT__=o);const Y=o.use||(e=>{if("pending"===e.status)throw e;if("fulfilled"===e.status)return e.value;throw"rejected"===e.status?e.reason:(e.status="pending",e.then((t=>{e.status="fulfilled",e.value=t}),(t=>{e.status="rejected",e.reason=t})),e)}),Q={dedupe:!0};c.defineProperty((e=>{const{value:t}=e,n=(0,o.useContext)($),r=d(t),s=(0,o.useMemo)((()=>r?t(n):t),[r,n,t]),i=(0,o.useMemo)((()=>r?s:q(n,s)),[r,n,s]),a=s&&s.provider,c=(0,o.useRef)(l);a&&!c.current&&(c.current=M(a(i.cache||B),s));const u=c.current;return u&&(i.cache=u[0],i.mutate=u[1]),I((()=>{if(u)return u[2]&&u[2](),u[3]}),[]),(0,o.createElement)($.Provider,p(e,{value:i}))}),"defaultValue",{value:z});const K=(J=(e,t,n)=>{const{cache:r,compare:s,suspense:a,fallbackData:c,revalidateOnMount:f,revalidateIfStale:h,refreshInterval:m,refreshWhenHidden:y,refreshWhenOffline:v,keepPreviousData:A}=n,[x,C,S,k]=g.get(r),[E,P]=N(e),O=(0,o.useRef)(!1),j=(0,o.useRef)(!1),U=(0,o.useRef)(E),M=(0,o.useRef)(t),B=(0,o.useRef)(n),F=()=>B.current,z=()=>F().isVisible()&&F().isOnline(),[q,$,W,H]=w(r,E),G=(0,o.useRef)({}).current,V=u(c)?n.fallback[E]:c,K=(e,t)=>{for(const n in G){const r=n;if("data"===r){if(!s(e[r],t[r])){if(!u(e[r]))return!1;if(!s(oe,t[r]))return!1}}else if(t[r]!==e[r])return!1}return!0},J=(0,o.useMemo)((()=>{const e=!!E&&!!t&&(u(f)?!F().isPaused()&&!a&&(!!u(h)||h):f),n=t=>{const n=p(t);return delete n._k,e?{isValidating:!0,isLoading:!0,...n}:n},r=q(),s=H(),o=n(r),i=r===s?o:n(s);let l=o;return[()=>{const e=n(q());return K(e,l)?(l.data=e.data,l.isLoading=e.isLoading,l.isValidating=e.isValidating,l.error=e.error,l):(l=e,e)},()=>i]}),[r,E]),X=(0,i.useSyncExternalStore)((0,o.useCallback)((e=>W(E,((t,n)=>{K(n,t)||e()}))),[r,E]),J[0],J[1]),Z=!O.current,ee=x[E]&&x[E].length>0,te=X.data,ne=u(te)?V:te,re=X.error,se=(0,o.useRef)(ne),oe=A?u(te)?se.current:te:ne,ie=!(ee&&!u(re))&&(Z&&!u(f)?f:!F().isPaused()&&(a?!u(ne)&&h:u(ne)||h)),ae=!!(E&&t&&Z&&ie),le=u(X.isValidating)?ae:X.isValidating,ce=u(X.isLoading)?ae:X.isLoading,ue=(0,o.useCallback)((async e=>{const t=M.current;if(!E||!t||j.current||F().isPaused())return!1;let r,o,i=!0;const a=e||{},c=!S[E]||!a.dedupe,p=()=>R?!j.current&&E===U.current&&O.current:E===U.current,f={isValidating:!1,isLoading:!1},h=()=>{$(f)},m=()=>{const e=S[E];e&&e[1]===o&&delete S[E]},g={isValidating:!0};u(q().data)&&(g.isLoading=!0);try{if(c&&($(g),n.loadingTimeout&&u(q().data)&&setTimeout((()=>{i&&p()&&F().onLoadingSlow(E,n)}),n.loadingTimeout),S[E]=[t(P),L()]),[r,o]=S[E],r=await r,c&&setTimeout(m,n.dedupingInterval),!S[E]||S[E][1]!==o)return c&&p()&&F().onDiscarded(E),!1;f.error=l;const e=C[E];if(!u(e)&&(o<=e[0]||o<=e[1]||0===e[1]))return h(),c&&p()&&F().onDiscarded(E),!1;const a=q().data;f.data=s(a,r)?a:r,c&&p()&&F().onSuccess(r,E,n)}catch(e){m();const t=F(),{shouldRetryOnError:n}=t;t.isPaused()||(f.error=e,c&&p()&&(t.onError(e,E,t),(!0===n||d(n)&&n(e))&&(F().revalidateOnFocus&&F().revalidateOnReconnect&&!z()||t.onErrorRetry(e,E,t,(e=>{const t=x[E];t&&t[0]&&t[0](3,e)}),{retryCount:(a.retryCount||0)+1,dedupe:!0}))))}return i=!1,h(),!0}),[E,r]),de=(0,o.useCallback)(((...e)=>D(r,U.current,...e)),[]);if(I((()=>{M.current=t,B.current=n,u(te)||(se.current=te)})),I((()=>{if(!E)return;const e=ue.bind(l,Q);let t=0;const n=((e,t,n)=>{const r=t[e]||(t[e]=[]);return r.push(n),()=>{const e=r.indexOf(n);e>=0&&(r[e]=r[r.length-1],r.pop())}})(E,x,((n,r={})=>{if(0==n){const n=Date.now();F().revalidateOnFocus&&n>t&&z()&&(t=n+F().focusThrottleInterval,e())}else if(1==n)F().revalidateOnReconnect&&z()&&e();else{if(2==n)return ue();if(3==n)return ue(r)}}));return j.current=!1,U.current=E,O.current=!0,$({_k:P}),ie&&(u(ne)||T?e():(r=e,_&&typeof window.requestAnimationFrame!=b?window.requestAnimationFrame(r):setTimeout(r,1))),()=>{j.current=!0,n()};var r}),[E]),I((()=>{let e;function t(){const t=d(m)?m(q().data):m;t&&-1!==e&&(e=setTimeout(n,t))}function n(){q().error||!y&&!F().isVisible()||!v&&!F().isOnline()?t():ue(Q).then(t)}return t(),()=>{e&&(clearTimeout(e),e=-1)}}),[m,y,v,E]),(0,o.useDebugValue)(oe),a&&u(ne)&&E){if(!R&&T)throw new Error("Fallback data is required when using suspense in SSR.");M.current=t,B.current=n,j.current=!1;const e=k[E];if(!u(e)){const t=de(e);Y(t)}if(!u(re))throw re;{const e=ue(Q);u(oe)||(e.status="fulfilled",e.value=!0),Y(e)}}return{mutate:de,get data(){return G.data=!0,oe},get error(){return G.error=!0,re},get isValidating(){return G.isValidating=!0,le},get isLoading(){return G.isLoading=!0,ce}}},function(...e){const t=p(z,(0,o.useContext)($)),[n,r,s]=G(e),i=q(t,s);let a=J;const{use:l}=i,c=(l||[]).concat(V);for(let e=c.length;e--;)a=c[e](a);return a(n,r||i.fetcher||null,i)});var J;const X=((e,t)=>(...n)=>{const[r,s,o]=G(n),i=(o.use||[]).concat(t);return e(r,s,{...o,use:i})})(K,(e=>(t,n,r)=>(r.revalidateOnFocus=!1,r.revalidateIfStale=!1,r.revalidateOnReconnect=!1,e(t,n,r))));var Z=n(373),ee=n(967),te=n.n(ee),ne=window.wp.apiFetch,re=n.n(ne),se=window.wp.components,oe=window.wp.data,ie=window.wp.element,ae=window.wp.i18n,le=window.wp.url;const ce=new Map,ue=new Map;let de=!1,pe=!1;function fe(e){if(!e)return!0;const t="string"==typeof e?parseInt(e,10):e;return!ce.has(t)&&(ce.set(t,!0),!0)}function he(e){if(!e)return;const t="string"==typeof e?parseInt(e,10):e;ce.set(t,!0)}const me=(e,t)=>{e.forEach((e=>{if("wp-curate/query"===e.name)t.push(e);else{const{innerBlocks:n}=e;if(!n)return;me(n,t)}}))};function ge(){if(de)return void(pe=!0);if(document.querySelector(".block-editor-block-switcher__popover__preview__parent"))return;de=!0,pe=!1,ce.clear(),ue.clear();const e=(0,oe.select)("core/block-editor").getBlocks(),{wp_curate_deduplication:t=!0,wp_curate_unique_pinned_posts:n=!1}=(0,oe.select)("core/editor").getEditedPostAttribute("meta")||{},r=[];me(e,r),n&&r.forEach((e=>{e?.attributes?.posts?.forEach((e=>{e&&fe(e)}))})),r.forEach((e=>{const{attributes:n}=e,{backfillPosts:r=null,deduplication:s="inherit",posts:o=[],numberOfPosts:i=5,postTypes:a=["post"],validPosts:l=[]}=n;if(!r)return;const c=a.join(",");let u=0;const d=[],p=o.map((e=>l.includes(e)?e:null)),f=r.filter((e=>!p.includes(e)));for(let e=0;e{let r,o,i=!1;if(null!==p[n])r=p[n],he(r);else do{f[u]&&(o=f[u],t&&"inherit"===s?i=fe(o):(i=!0,he(o))),u+=1}while(!1===i&&u<=f.length);d.push(r||o)})),(0,oe.dispatch)("core/block-editor").updateBlockAttributes(e.clientId,{query:{perPage:i,postType:"post",type:c,include:d.join(","),orderby:"include"},queryId:0})})),de=!1,pe&&ge()}var ye=e=>{let[t,n]=e;return re()({path:t}).then((e=>{let t;return t=Array.isArray(e)?e.filter((e=>e!==n)):e.id===n?null:e,t}))},ve=n(893),be=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"wp-curate/query","version":"0.1.0","title":"Query","category":"theme","icon":"filter","description":"Custom queries for WP Curate","textdomain":"wp-curate","editorScript":"file:index.ts","editorStyle":"file:index.css","style":["file:style-index.css"],"providesContext":{"query":"query","displayLayout":"displayLayout","heading":"heading","curation":"curation","pinnedPosts":"posts","moveData":"moveData","customPostTitles":"customPostTitles"},"attributes":{"deduplication":{"default":"inherit","enum":["inherit","never"],"type":"string"},"minNumberOfPosts":{"default":1,"type":"number"},"numberOfPosts":{"default":5,"type":"number"},"offset":{"default":0,"type":"number"},"postTypes":{"default":[],"items":{"type":"string"},"type":"array"},"posts":{"default":[],"items":{"type":"number"},"type":"array"},"searchTerm":{"default":"","type":"string"},"terms":{"default":{},"items":{"default":[],"items":{"type":"object"},"type":"array"},"type":"object"},"termRelations":{"default":{},"items":{"default":"AND","enum":["AND","OR"],"type":"string"},"type":"object"},"taxRelation":{"default":"AND","enum":["AND","OR"],"type":"string"},"orderby":{"default":"date","enum":["date","trending"],"type":"string"},"customPostTitles":{"default":[],"items":{"default":{},"type":"object"},"type":"array"}}}');(0,r.registerBlockType)(be,{edit:function(e){let{attributes:{backfillPosts:t=[],deduplication:n="inherit",minNumberOfPosts:r=1,numberOfPosts:i=5,offset:a=0,posts:l=[],postTypes:c=[],searchTerm:u="",terms:d={},termRelations:p={},taxRelation:f="AND",orderby:h="date",moveData:m={}},setAttributes:g}=e;const{wpCurateQueryBlock:{allowedPostTypes:y=[],allowedTaxonomies:v=[],parselyAvailable:b="false",maxPosts:_=10}={}}=window;c.length||g({postTypes:y});const A=[{label:(0,ae.__)("AND","wp-curate"),value:"AND"},{label:(0,ae.__)("OR","wp-curate"),value:"OR"}],[w,x,C]=(0,oe.useSelect)((e=>{const t=e("core/editor"),n=t.getEditedPostAttribute("type"),r=t.getEditedPostAttribute("meta");return[Boolean(r?.wp_curate_deduplication),n?e("core").getPostType(n):null,Boolean(r?.wp_curate_unique_pinned_posts)]})),S=function(e,t){const[n,r]=o.useState(e);return o.useEffect((()=>{const t=setTimeout((()=>{r(e)}),500);return()=>{clearTimeout(t)}}),[e,500]),n}(null!=u?u:""),[k,E]=(0,ie.useState)({}),[R,T]=(0,ie.useState)({}),I=v.filter((e=>d[e]?.length>0)).length,P=function(e,t,n,r,s){const o=e.filter((e=>t[e]?.length>0)).length,i=[];return Object.keys(n).length>0&&(e.forEach((e=>{if(t[e]?.length>0){const s=n[e].rest_base;s&&(i.push(`${s}[terms]=${t[e].map((e=>e.id)).join(",")}`),""!==r[e]&&void 0!==r[e]&&i.push(`${s}[operator]=${r[e]}`))}})),o>1&&i.push(`tax_relation=${s}`)),i.join("&")}(v,d,k,p,f),O=l.map((e=>null!=e?e:null)).join(","),N=Number((0,oe.useSelect)((e=>e("core/editor").getCurrentPostId()),[])),j=c.join(","),L=Object.keys(k).length>0?`${D={search:S,offset:a,postType:j,status:"publish",perPage:20,orderBy:h,currentPostId:N},(0,le.addQueryArgs)("/wp-curate/v1/posts",{search:D.search,offset:D.offset,post_type:D.postType,status:D.status,per_page:D.perPage,orderby:D.orderBy,current_post_id:D.currentPostId})}&${P}`:void 0;var D;const{data:U,error:M}=X([L,N],ye);(0,ie.useEffect)((()=>{(async()=>{re()({path:"/wp/v2/taxonomies"}).then((e=>{E(e)}))})()}),[]),(0,ie.useEffect)((()=>{(async()=>{re()({path:"/wp/v2/types"}).then((e=>{T(e)}))})()}),[]),(0,ie.useEffect)((()=>{U&&!M&&g({backfillPosts:U})}),[U,M,g]),(0,ie.useEffect)((()=>{U&&!M&&ge()}),[O,t,i,g,j,w,n,C,U,M]),(0,ie.useEffect)((()=>{(async()=>{const e=l.filter((e=>null!==e)).join(",");let t=[];e.length>0&&(t=await re()({path:(0,le.addQueryArgs)("/wp/v2/posts",{offset:0,orderby:"include",per_page:e.length,type:"post",include:e,_locale:"user"})}).then((e=>e.map((e=>e.id))))),g({validPosts:t}),ge()})()}),[l,g]);const B=(e,t)=>{const n=[...l];null!==e&&n.includes(e)&&n.splice(n.indexOf(e),1,null),n.splice(t,1,e),g({posts:n})};for(let e=0;e{y.includes(e)&&F.push({label:R[e].name,value:e})})),(0,ve.jsxs)(ve.Fragment,{children:[(0,ve.jsx)("div",{...(0,s.useBlockProps)({className:te()({"wp-curate-query-block--move":m.postId})}),children:(0,ve.jsx)(s.InnerBlocks,{template:[["core/post-template",{},[["wp-curate/post",{},[["wp-curate/post-title",{}],["core/post-excerpt",{}]]]]]]})}),(0,ve.jsxs)(s.InspectorControls,{children:[(0,ve.jsxs)(se.PanelBody,{title:(0,ae.__)("Setup","wp-curate"),initialOpen:!0,children:[void 0!==r&&r!==_?(0,ve.jsx)(se.RangeControl,{label:(0,ae.__)("Number of Posts","wp-curate"),help:(0,ae.__)("The maximum number of posts to show.","wp-curate"),value:i,onChange:e=>{g({numberOfPosts:e,posts:l.slice(0,e)})},min:r,max:_}):null,(0,ve.jsx)(se.RangeControl,{label:(0,ae.__)("Offset","wp-curate"),help:(0,ae.__)("The number of posts to pass over.","wp-curate"),onChange:e=>g({offset:e}),value:a,min:0,max:20})]}),(0,ve.jsx)(se.PanelBody,{title:(0,ae.__)("Select Posts","wp-curate"),initialOpen:!1,className:"manual-posts",children:l.map(((e,t)=>(0,ve.jsxs)(se.PanelRow,{className:te()("manual-posts__container",{"manual-posts__container--selected":l[t]}),children:[(0,ve.jsx)("span",{className:"manual-posts__counter",children:t+1}),(0,ve.jsx)(Z.PostPicker,{allowedTypes:y,onReset:()=>B(0,t),onUpdate:e=>{B(e,t)},value:l[t]||0,className:"manual-posts__picker"})]},t)))}),(0,ve.jsxs)(se.PanelBody,{title:(0,ae.__)("Query Parameters","wp-curate"),initialOpen:!1,children:[(0,ve.jsx)(Z.Checkboxes,{label:(0,ae.__)("Post Types","wp-curate"),value:c,onChange:e=>g({postTypes:e}),options:F}),Object.keys(k).length>0?v.map((e=>{var t,n;return(0,ve.jsxs)(ie.Fragment,{children:[(0,ve.jsx)(Z.TermSelector,{label:k[e].name||e,subTypes:[e],selected:null!==(t=d[e])&&void 0!==t?t:[],onSelect:t=>((e,t)=>{const n=t.map((e=>({id:e.id,title:e.title,url:e.url,type:e.type}))),r={...d,[e]:n};g({terms:r})})(e,t),multiple:!0}),d[e]?.length>1?(0,ve.jsx)(se.SelectControl,{label:(0,ae.sprintf)((0,ae.__)("%s Relation","wp-curate"),k[e].name||e),help:(0,ae.__)("AND: Posts must have all selected terms. OR: Posts may have one or more selected terms.","wp-curate"),options:A,onChange:t=>((e,t)=>{const n={...p,[e]:t};g({termRelations:n})})(e,t),value:null!==(n=p[e])&&void 0!==n?n:"OR"}):null,(0,ve.jsx)("hr",{})]},e)})):null,I>1?(0,ve.jsx)(se.SelectControl,{label:(0,ae.__)("Taxonomy Relation","wp-curate"),help:(0,ae.__)("AND: Posts must meet all selected taxonomy requirements. OR: Posts may have meet one or more selected taxonomy requirements.","wp-curate"),options:A,onChange:e=>g({taxRelation:e}),value:f}):null,(0,ve.jsx)(se.TextControl,{label:(0,ae.__)("Search Term","wp-curate"),onChange:e=>g({searchTerm:e}),value:u}),"true"===b?(0,ve.jsx)(se.ToggleControl,{label:(0,ae.__)("Show Trending Content from Parsely","wp-curate"),help:(0,ae.__)("If enabled, the block will show trending content from Parsely.","wp-curate"),checked:"trending"===h,onChange:e=>g({orderby:e?"trending":"date"})}):null]})]}),(0,ve.jsx)(s.InspectorControls,{group:"advanced",children:(0,ve.jsx)(se.RadioControl,{label:(0,ae.__)("Deduplication","wp-curate"),help:(0,ae.__)("Customize whether posts that have already appeared in previous query blocks can appear again in this block.","wp-curate"),options:[{label:(0,ie.createInterpolateElement)((0,ae.sprintf)((0,ae.__)("Inherit deduplication setting from this %1$s (currently %2$s)","wp-curate"),x?x.labels.singular_name:"post",`${w?(0,ae.__)("enabled","wp-curate"):(0,ae.__)("disabled","wp-curate")}`),{strong:(0,ve.jsx)("strong",{})}),value:"inherit"},{label:(0,ae.__)("Never exclude posts appearing in previous query blocks","wp-curate"),value:"never"}],onChange:e=>g({deduplication:e}),selected:n})})]})},save:()=>{const e=s.useBlockProps.save();return(0,ve.jsx)("div",{...e,children:(0,ve.jsx)(s.InnerBlocks.Content,{})})}})},251:function(e,t,n){"use strict";var r=n(196),s=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,o={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:s,type:e,key:c,ref:u,props:o,_owner:a.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},893:function(e,t,n){"use strict";e.exports=n(251)},250:function(e,t,n){"use strict";var r=n(196),s="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,i=r.useEffect,a=r.useLayoutEffect,l=r.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!s(e,n)}catch(e){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=o({inst:{value:n,getSnapshot:t}}),s=r[0].inst,u=r[1];return a((function(){s.value=n,s.getSnapshot=t,c(s)&&u({inst:s})}),[e,n,t]),i((function(){return c(s)&&u({inst:s}),e((function(){c(s)&&u({inst:s})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:u},688:function(e,t,n){"use strict";e.exports=n(250)},196:function(e){"use strict";e.exports=window.React},967:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function s(){for(var e="",t=0;t=o)&&Object.keys(r.O).every((function(e){return r.O[e](n[l])}))?n.splice(l--,1):(a=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,s,o]},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){var e={477:0,566:0};r.O.j=function(t){return 0===e[t]};var t=function(t,n){var s,o,i=n[0],a=n[1],l=n[2],c=0;if(i.some((function(t){return 0!==e[t]}))){for(s in a)r.o(a,s)&&(r.m[s]=a[s]);if(l)var u=l(r)}for(t&&t(n);cshould_register_block() ) { + return; + } + + // Register the block by passing the location of block.json. + register_block_type( + __DIR__, + [ + 'render_callback' => 'wp_curate_render_query_block', + ], + ); + + /** + * Filter the post types that can be used in the Query block. + * + * @param array $allowed_post_types The allowed post types. + */ + $allowed_post_types = apply_filters( 'wp_curate_allowed_post_types', [ 'post' ] ); + + /** + * Filter the taxonomies that can be used in the Query block. + * + * @param array $allowed_taxonomies The allowed taxonomies. + */ + $allowed_taxonomies = apply_filters( 'wp_curate_allowed_taxonomies', [ 'category', 'post_tag' ] ); + + /** + * Filter the maximum number of posts that can be displayed in the Query block. + * + * @param integer $max_posts The maximum number of posts to display. + */ + $max_posts = apply_filters( 'wp_curate_max_posts', 10 ); + + /** + * Filter whether to use Parsely. + * + * @param bool $use_parsely Whether to use Parsely. + */ + $parsely_available = apply_filters( 'wp_curate_use_parsely', false ); + wp_localize_script( + 'wp-curate-query-editor-script', + 'wpCurateQueryBlock', + [ + 'allowedPostTypes' => $allowed_post_types, + 'allowedTaxonomies' => $allowed_taxonomies, + 'parselyAvailable' => $parsely_available ? 'true' : 'false', + 'maxPosts' => $max_posts, + ] + ); +} +add_action( 'init', 'wp_curate_query_block_init' ); + +/** + * Renders the `wp-curate/query` block on the server. + * + * @param array $attributes Block attributes. + * @param string $content Block default content. + * @return string Block output. + */ +function wp_curate_render_query_block( $attributes, $content ): string { + $proc = new WP_HTML_Tag_Processor( $content ); + + /* + * If a query returns no posts -- denoted by the absence of a list in the content -- don't + * show any of the inner content. + * + * This approach is not great because the inner blocks will have been rendered already and their + * scripts and styles will have been enqueued, but it's not clear what other options are + * available because the post template inner block needs to render for us to know whether there + * are any posts to begin with. + */ + return $proc->next_tag( [ 'tag_name' => 'ul' ] ) === true || $proc->next_tag( [ 'tag_name' => 'ol' ] ) === true ? $content : ''; +} diff --git a/build/query/style-index.css b/build/query/style-index.css new file mode 100644 index 00000000..de232b2b --- /dev/null +++ b/build/query/style-index.css @@ -0,0 +1 @@ +.wp-block-wp-curate-query{min-height:50px;padding:2px} diff --git a/build/slotfills/index.asset.php b/build/slotfills/index.asset.php new file mode 100644 index 00000000..c3ca0178 --- /dev/null +++ b/build/slotfills/index.asset.php @@ -0,0 +1 @@ + array('react', 'wp-components', 'wp-data', 'wp-edit-post', 'wp-i18n', 'wp-plugins'), 'version' => '16447fc48d46bfbccce3'); diff --git a/build/slotfills/index.js b/build/slotfills/index.js new file mode 100644 index 00000000..d3b0793c --- /dev/null +++ b/build/slotfills/index.js @@ -0,0 +1,42 @@ +!function(){var e={373:function(e){var t;self,t=()=>(()=>{var e={6484:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function s(){for(var e=[],t=0;t{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".alley-scripts-post-picker__post-list{display:flex;flex-wrap:wrap;float:left;height:calc(70vh - 200px);justify-content:flex-start;overflow-y:auto;padding:8px;width:100%}.alley-scripts-post-picker__post{border:1px solid #eee;height:auto;justify-content:center;margin:0 8px 8px 0;transition:background-color .2s ease-in-out;width:calc((100% - 40px)/3)}@media(min-width: 780px){.alley-scripts-post-picker__post{width:calc((100% - 40px)/5)}}.alley-scripts-post-picker__post:hover{background-color:#f0f0f0}.alley-scripts-post-picker__post.is-selected{background-color:#f0f0f0}.alley-scripts-post-picker__load-more{clear:both;float:left;text-align:center;width:100%}","",{version:3,sources:["webpack://./src/components/post-picker/post-list.scss"],names:[],mappings:"AAAA,sCACE,YAAA,CACA,cAAA,CACA,UAAA,CACA,yBAAA,CACA,0BAAA,CACA,eAAA,CACA,WAAA,CACA,UAAA,CAGF,iCACE,qBAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,2CAAA,CACA,2BAAA,CAGA,yBATF,iCAUI,2BAAA,CAAA,CAGF,uCACE,wBAAA,CAGF,6CACE,wBAAA,CAIJ,sCACE,UAAA,CACA,UAAA,CACA,iBAAA,CACA,UAAA",sourcesContent:[".alley-scripts-post-picker__post-list {\n display: flex;\n flex-wrap: wrap;\n float: left;\n height: calc(70vh - 200px);\n justify-content: flex-start;\n overflow-y: auto;\n padding: 8px;\n width: 100%;\n}\n\n.alley-scripts-post-picker__post {\n border: 1px solid #eee;\n height: auto;\n justify-content: center;\n margin: 0 8px 8px 0;\n transition: background-color 0.2s ease-in-out;\n width: calc((100% - 40px) / 3);\n\n\n @media (min-width: 780px) {\n width: calc((100% - 40px) / 5);\n }\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n &.is-selected {\n background-color: #f0f0f0;\n }\n}\n\n.alley-scripts-post-picker__load-more {\n clear: both;\n float: left;\n text-align: center;\n width: 100%;\n}\n"],sourceRoot:""}]);const a=i},9680:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".alley-scripts-post-picker__modal .components-modal__content{width:90vw}.alley-scripts-post-picker__buttons{clear:both;display:block;text-align:right;width:100%}.alley-scripts-post-picker__buttons button{margin:5px}","",{version:3,sources:["webpack://./src/components/post-picker/search-modal.scss"],names:[],mappings:"AACE,6DACE,UAAA,CAIJ,oCACE,UAAA,CACA,aAAA,CACA,gBAAA,CACA,UAAA,CAEA,2CACE,UAAA",sourcesContent:[".alley-scripts-post-picker__modal {\n .components-modal__content {\n width: 90vw;\n }\n}\n\n.alley-scripts-post-picker__buttons {\n clear: both;\n display: block;\n text-align: right;\n width: 100%;\n\n button {\n margin: 5px;\n }\n}\n"],sourceRoot:""}]);const a=i},3800:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,".post-picker-notice{margin:0 0 .5rem 0}","",{version:3,sources:["webpack://./src/components/post-picker/style.scss"],names:[],mappings:"AAAA,oBACE,kBAAA",sourcesContent:[".post-picker-notice {\n margin: 0 0 0.5rem 0;\n}\n"],sourceRoot:""}]);const a=i},5500:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(2876),s=n.n(r),o=n(1849),i=n.n(o)()(s());i.push([e.id,'.edit-post-sidebar .autocomplete__component,.editor-styles-wrapper .autocomplete__component{margin-bottom:20px}.edit-post-sidebar .autocomplete-base-control,.editor-styles-wrapper .autocomplete-base-control{position:relative}.edit-post-sidebar .autocomplete-text-control__input,.editor-styles-wrapper .autocomplete-text-control__input{margin:0}.edit-post-sidebar .autocomplete__selection-list,.editor-styles-wrapper .autocomplete__selection-list{list-style-type:none;margin:0 0 6px;padding:0}.edit-post-sidebar .autocomplete__selection-list--item,.editor-styles-wrapper .autocomplete__selection-list--item{display:inline-block;list-style:none}.edit-post-sidebar .autocomplete__selection-list--item--button,.editor-styles-wrapper .autocomplete__selection-list--item--button{margin-bottom:4px;margin-right:3px}.edit-post-sidebar .autocomplete__selection-list--item--button::after,.editor-styles-wrapper .autocomplete__selection-list--item--button::after{content:"×";font-size:16px;line-height:20px;margin-left:5px}.edit-post-sidebar .autocomplete__dropdown,.editor-styles-wrapper .autocomplete__dropdown{background-color:#fff;border-color:rgba(0,0,0,0) #e2e4e7 #e2e4e7;border-radius:0 0 4px 4px;border-style:solid;border-width:0 1px 1px;left:0;max-height:0;overflow-y:hidden;position:absolute;top:calc(100% + 1px);visibility:hidden;width:100%;z-index:10}.edit-post-sidebar .autocomplete__dropdown--is-open,.editor-styles-wrapper .autocomplete__dropdown--is-open{box-shadow:0 3px 30px rgba(25,30,35,.1);max-height:225px;overflow-y:scroll;visibility:visible}.edit-post-sidebar .autocomplete__dropdown--notice,.editor-styles-wrapper .autocomplete__dropdown--notice{padding:15px}.edit-post-sidebar .autocomplete__dropdown--results,.editor-styles-wrapper .autocomplete__dropdown--results{list-style:none;margin:0;padding:0}.edit-post-sidebar .autocomplete__list--item,.editor-styles-wrapper .autocomplete__list--item{list-style:none}.edit-post-sidebar .autocomplete__list--item>button,.editor-styles-wrapper .autocomplete__list--item>button{background:rgba(0,0,0,0);border-color:#e2e4e7;border-style:solid;border-width:0 0 1px;height:100%;line-height:1.25;text-align:left;white-space:inherit;width:100%}.edit-post-sidebar .autocomplete__list--item:last-child>button,.editor-styles-wrapper .autocomplete__list--item:last-child>button{border-bottom:0}',"",{version:3,sources:["webpack://./src/components/selector/styles.scss"],names:[],mappings:"AAAA,4FAgBI,kBACE,CAAA,gGAMF,iBACE,CAAA,8GAMF,QACE,CAAA,sGAMF,oBACE,CAAA,cACA,CAAA,SACA,CAAA,kHAEA,oBACE,CAAA,eACA,CAAA,kIAEA,iBACE,CAAA,gBACA,CAAA,gJAEA,WACE,CAAA,cACA,CAAA,gBACA,CAAA,eACA,CAAA,0FASR,qBACE,CAAA,0CACA,CAAA,yBACA,CAAA,kBACA,CAAA,sBACA,CAAA,MACA,CAAA,YACA,CAAA,iBACA,CAAA,iBACA,CAAA,oBACA,CAAA,iBACA,CAAA,UACA,CAAA,UACA,CAAA,4GAGA,uCACE,CAAA,gBACA,CAAA,iBACA,CAAA,kBACA,CAAA,0GAIF,YACE,CAAA,4GAIF,eACE,CAAA,QACA,CAAA,SACA,CAAA,8FAOJ,eACE,CAAA,4GAEA,wBACE,CAAA,oBACA,CAAA,kBACA,CAAA,oBACA,CAAA,WACA,CAAA,gBACA,CAAA,eACA,CAAA,mBACA,CAAA,UACA,CAAA,kIAGF,eACE",sourcesContent:["//--------------------------------------------------------------\n// AutoComplete Styles\n//--------------------------------------------------------------\n\n/* stylelint-disable max-nesting-depth */\n\n//-----------------------------------------\n// Accommodate editor well, or the sidebar.\n//-----------------------------------------\n.edit-post-sidebar,\n.editor-styles-wrapper {\n .autocomplete {\n\n //-----------------------------------------\n // Parent form wrapper.\n //-----------------------------------------\n &__component {\n margin-bottom: 20px;\n }\n\n //-----------------------------------------\n // Wrapper\n //-----------------------------------------\n &-base-control {\n position: relative;\n }\n\n //-----------------------------------------\n // Input\n //-----------------------------------------\n &-text-control__input {\n margin: 0;\n }\n\n //-----------------------------------------\n // Selected buttons.\n //-----------------------------------------\n &__selection-list {\n list-style-type: none;\n margin: 0 0 6px;\n padding: 0;\n\n &--item {\n display: inline-block;\n list-style: none;\n\n &--button {\n margin-bottom: 4px;\n margin-right: 3px;\n\n &::after {\n content: '×';\n font-size: 16px;\n line-height: 20px;\n margin-left: 5px;\n }\n }\n }\n }\n\n //-----------------------------------------\n // Results\n //-----------------------------------------\n &__dropdown {\n background-color: #fff;\n border-color: transparent #e2e4e7 #e2e4e7;\n border-radius: 0 0 4px 4px;\n border-style: solid;\n border-width: 0 1px 1px;\n left: 0;\n max-height: 0;\n overflow-y: hidden;\n position: absolute;\n top: calc(100% + 1px); // Offset focus border.\n visibility: hidden;\n width: 100%;\n z-index: 10;\n\n // Container is open.\n &--is-open {\n box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1);\n max-height: 225px;\n overflow-y: scroll;\n visibility: visible;\n }\n\n // Notice handler.\n &--notice {\n padding: 15px;\n }\n\n // Results container.\n &--results {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n }\n\n //-----------------------------------------\n // List/Results\n //-----------------------------------------\n &__list--item {\n list-style: none;\n\n > button {\n background: transparent;\n border-color: #e2e4e7;\n border-style: solid;\n border-width: 0 0 1px;\n height: 100%;\n line-height: 1.25;\n text-align: left;\n white-space: inherit;\n width: 100%;\n }\n\n &:last-child > button {\n border-bottom: 0;\n }\n }\n }\n}\n"],sourceRoot:""}]);const a=i},1849:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var a=0;a0?" ".concat(u[5]):""," {").concat(u[1],"}")),u[5]=o),n&&(u[2]?(u[1]="@media ".concat(u[2]," {").concat(u[1],"}"),u[2]=n):u[2]=n),s&&(u[4]?(u[1]="@supports (".concat(u[4],") {").concat(u[1],"}"),u[4]=s):u[4]="".concat(s)),t.push(u))}},t}},2876:e=>{"use strict";e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var r=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),s="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),o="/*# ".concat(s," */");return[t].concat([o]).join("\n")}return[t].join("\n")}},6595:function(e){e.exports=function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:r,getOwnPropertyDescriptor:s}=Object;let{freeze:o,seal:i,create:a}=Object,{apply:l,construct:c}="undefined"!=typeof Reflect&&Reflect;o||(o=function(e){return e}),i||(i=function(e){return e}),l||(l=function(e,t,n){return e.apply(t,n)}),c||(c=function(e,t){return new e(...t)});const u=C(Array.prototype.forEach),d=C(Array.prototype.pop),p=C(Array.prototype.push),f=C(String.prototype.toLowerCase),h=C(String.prototype.toString),m=C(String.prototype.match),g=C(String.prototype.replace),y=C(String.prototype.indexOf),v=C(String.prototype.trim),A=C(RegExp.prototype.test),b=(_=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),s=1;s2&&void 0!==arguments[2]?arguments[2]:f;t&&t(e,null);let o=r.length;for(;o--;){let t=r[o];if("string"==typeof t){const e=s(t);e!==t&&(n(r)||(r[o]=e),t=e)}e[t]=!0}return e}function x(t){const n=a(null);for(const[r,o]of e(t))void 0!==s(t,r)&&(n[r]=o);return n}function S(e,t){for(;null!==e;){const n=s(e,t);if(n){if(n.get)return C(n.get);if("function"==typeof n.value)return C(n.value)}e=r(e)}return function(e){return console.warn("fallback value for",e),null}}const k=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),E=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),R=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),T=o(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),I=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),P=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),N=o(["#text"]),O=o(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),L=o(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),j=o(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),D=o(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),U=i(/\{\{[\w\W]*|[\w\W]*\}\}/gm),M=i(/<%[\w\W]*|[\w\W]*%>/gm),B=i(/\${[\w\W]*}/gm),F=i(/^data-[\-\w.\u00B7-\uFFFF]/),z=i(/^aria-[\-\w]+$/),q=i(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),$=i(/^(?:\w+script|data):/i),H=i(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),W=i(/^html$/i);var G=Object.freeze({__proto__:null,MUSTACHE_EXPR:U,ERB_EXPR:M,TMPLIT_EXPR:B,DATA_ATTR:F,ARIA_ATTR:z,IS_ALLOWED_URI:q,IS_SCRIPT_OR_DATA:$,ATTR_WHITESPACE:H,DOCTYPE_NAME:W});return function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"undefined"==typeof window?null:window;const r=e=>t(e);if(r.version="3.0.6",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;let{document:s}=n;const i=s,l=i.currentScript,{DocumentFragment:c,HTMLTemplateElement:_,Node:C,Element:U,NodeFilter:M,NamedNodeMap:B=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:F,DOMParser:z,trustedTypes:$}=n,H=U.prototype,Y=S(H,"cloneNode"),V=S(H,"nextSibling"),K=S(H,"childNodes"),Q=S(H,"parentNode");if("function"==typeof _){const e=s.createElement("template");e.content&&e.content.ownerDocument&&(s=e.content.ownerDocument)}let J,X="";const{implementation:Z,createNodeIterator:ee,createDocumentFragment:te,getElementsByTagName:ne}=s,{importNode:re}=i;let se={};r.isSupported="function"==typeof e&&"function"==typeof Q&&Z&&void 0!==Z.createHTMLDocument;const{MUSTACHE_EXPR:oe,ERB_EXPR:ie,TMPLIT_EXPR:ae,DATA_ATTR:le,ARIA_ATTR:ce,IS_SCRIPT_OR_DATA:ue,ATTR_WHITESPACE:de}=G;let{IS_ALLOWED_URI:pe}=G,fe=null;const he=w({},[...k,...E,...R,...I,...N]);let me=null;const ge=w({},[...O,...L,...j,...D]);let ye=Object.seal(a(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,Ae=null,be=!0,_e=!0,Ce=!1,we=!0,xe=!1,Se=!1,ke=!1,Ee=!1,Re=!1,Te=!1,Ie=!1,Pe=!0,Ne=!1,Oe=!0,Le=!1,je={},De=null;const Ue=w({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Me=null;const Be=w({},["audio","video","img","source","image","track"]);let Fe=null;const ze=w({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),qe="http://www.w3.org/1998/Math/MathML",$e="http://www.w3.org/2000/svg",He="http://www.w3.org/1999/xhtml";let We=He,Ge=!1,Ye=null;const Ve=w({},[qe,$e,He],h);let Ke=null;const Qe=["application/xhtml+xml","text/html"];let Je=null,Xe=null;const Ze=s.createElement("form"),et=function(e){return e instanceof RegExp||e instanceof Function},tt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!Xe||Xe!==e){if(e&&"object"==typeof e||(e={}),e=x(e),Ke=Ke=-1===Qe.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Je="application/xhtml+xml"===Ke?h:f,fe="ALLOWED_TAGS"in e?w({},e.ALLOWED_TAGS,Je):he,me="ALLOWED_ATTR"in e?w({},e.ALLOWED_ATTR,Je):ge,Ye="ALLOWED_NAMESPACES"in e?w({},e.ALLOWED_NAMESPACES,h):Ve,Fe="ADD_URI_SAFE_ATTR"in e?w(x(ze),e.ADD_URI_SAFE_ATTR,Je):ze,Me="ADD_DATA_URI_TAGS"in e?w(x(Be),e.ADD_DATA_URI_TAGS,Je):Be,De="FORBID_CONTENTS"in e?w({},e.FORBID_CONTENTS,Je):Ue,ve="FORBID_TAGS"in e?w({},e.FORBID_TAGS,Je):{},Ae="FORBID_ATTR"in e?w({},e.FORBID_ATTR,Je):{},je="USE_PROFILES"in e&&e.USE_PROFILES,be=!1!==e.ALLOW_ARIA_ATTR,_e=!1!==e.ALLOW_DATA_ATTR,Ce=e.ALLOW_UNKNOWN_PROTOCOLS||!1,we=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,xe=e.SAFE_FOR_TEMPLATES||!1,Se=e.WHOLE_DOCUMENT||!1,Re=e.RETURN_DOM||!1,Te=e.RETURN_DOM_FRAGMENT||!1,Ie=e.RETURN_TRUSTED_TYPE||!1,Ee=e.FORCE_BODY||!1,Pe=!1!==e.SANITIZE_DOM,Ne=e.SANITIZE_NAMED_PROPS||!1,Oe=!1!==e.KEEP_CONTENT,Le=e.IN_PLACE||!1,pe=e.ALLOWED_URI_REGEXP||q,We=e.NAMESPACE||He,ye=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&et(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ye.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&et(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ye.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ye.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),xe&&(_e=!1),Te&&(Re=!0),je&&(fe=w({},[...N]),me=[],!0===je.html&&(w(fe,k),w(me,O)),!0===je.svg&&(w(fe,E),w(me,L),w(me,D)),!0===je.svgFilters&&(w(fe,R),w(me,L),w(me,D)),!0===je.mathMl&&(w(fe,I),w(me,j),w(me,D))),e.ADD_TAGS&&(fe===he&&(fe=x(fe)),w(fe,e.ADD_TAGS,Je)),e.ADD_ATTR&&(me===ge&&(me=x(me)),w(me,e.ADD_ATTR,Je)),e.ADD_URI_SAFE_ATTR&&w(Fe,e.ADD_URI_SAFE_ATTR,Je),e.FORBID_CONTENTS&&(De===Ue&&(De=x(De)),w(De,e.FORBID_CONTENTS,Je)),Oe&&(fe["#text"]=!0),Se&&w(fe,["html","head","body"]),fe.table&&(w(fe,["tbody"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');J=e.TRUSTED_TYPES_POLICY,X=J.createHTML("")}else void 0===J&&(J=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const r="data-tt-policy-suffix";t&&t.hasAttribute(r)&&(n=t.getAttribute(r));const s="dompurify"+(n?"#"+n:"");try{return e.createPolicy(s,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+s+" could not be created."),null}}($,l)),null!==J&&"string"==typeof X&&(X=J.createHTML(""));o&&o(e),Xe=e}},nt=w({},["mi","mo","mn","ms","mtext"]),rt=w({},["foreignobject","desc","title","annotation-xml"]),st=w({},["title","style","font","a","script"]),ot=w({},E);w(ot,R),w(ot,T);const it=w({},I);w(it,P);const at=function(e){p(r.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},lt=function(e,t){try{p(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!me[e])if(Re||Te)try{at(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ct=function(e){let t=null,n=null;if(Ee)e=""+e;else{const t=m(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ke&&We===He&&(e=''+e+"");const r=J?J.createHTML(e):e;if(We===He)try{t=(new z).parseFromString(r,Ke)}catch(e){}if(!t||!t.documentElement){t=Z.createDocument(We,"template",null);try{t.documentElement.innerHTML=Ge?X:r}catch(e){}}const o=t.body||t.documentElement;return e&&n&&o.insertBefore(s.createTextNode(n),o.childNodes[0]||null),We===He?ne.call(t,Se?"html":"body")[0]:Se?t.documentElement:o},ut=function(e){return ee.call(e.ownerDocument||e,e,M.SHOW_ELEMENT|M.SHOW_COMMENT|M.SHOW_TEXT,null)},dt=function(e){return"function"==typeof C&&e instanceof C},pt=function(e,t,n){se[e]&&u(se[e],(e=>{e.call(r,t,n,Xe)}))},ft=function(e){let t=null;if(pt("beforeSanitizeElements",e,null),(n=e)instanceof F&&("string"!=typeof n.nodeName||"string"!=typeof n.textContent||"function"!=typeof n.removeChild||!(n.attributes instanceof B)||"function"!=typeof n.removeAttribute||"function"!=typeof n.setAttribute||"string"!=typeof n.namespaceURI||"function"!=typeof n.insertBefore||"function"!=typeof n.hasChildNodes))return at(e),!0;var n;const s=Je(e.nodeName);if(pt("uponSanitizeElement",e,{tagName:s,allowedTags:fe}),e.hasChildNodes()&&!dt(e.firstElementChild)&&A(/<[/\w]/g,e.innerHTML)&&A(/<[/\w]/g,e.textContent))return at(e),!0;if(!fe[s]||ve[s]){if(!ve[s]&&mt(s)){if(ye.tagNameCheck instanceof RegExp&&A(ye.tagNameCheck,s))return!1;if(ye.tagNameCheck instanceof Function&&ye.tagNameCheck(s))return!1}if(Oe&&!De[s]){const t=Q(e)||e.parentNode,n=K(e)||e.childNodes;if(n&&t)for(let r=n.length-1;r>=0;--r)t.insertBefore(Y(n[r],!0),V(e))}return at(e),!0}return e instanceof U&&!function(e){let t=Q(e);t&&t.tagName||(t={namespaceURI:We,tagName:"template"});const n=f(e.tagName),r=f(t.tagName);return!!Ye[e.namespaceURI]&&(e.namespaceURI===$e?t.namespaceURI===He?"svg"===n:t.namespaceURI===qe?"svg"===n&&("annotation-xml"===r||nt[r]):Boolean(ot[n]):e.namespaceURI===qe?t.namespaceURI===He?"math"===n:t.namespaceURI===$e?"math"===n&&rt[r]:Boolean(it[n]):e.namespaceURI===He?!(t.namespaceURI===$e&&!rt[r])&&!(t.namespaceURI===qe&&!nt[r])&&!it[n]&&(st[n]||!ot[n]):!("application/xhtml+xml"!==Ke||!Ye[e.namespaceURI]))}(e)?(at(e),!0):"noscript"!==s&&"noembed"!==s&&"noframes"!==s||!A(/<\/no(script|embed|frames)/i,e.innerHTML)?(xe&&3===e.nodeType&&(t=e.textContent,u([oe,ie,ae],(e=>{t=g(t,e," ")})),e.textContent!==t&&(p(r.removed,{element:e.cloneNode()}),e.textContent=t)),pt("afterSanitizeElements",e,null),!1):(at(e),!0)},ht=function(e,t,n){if(Pe&&("id"===t||"name"===t)&&(n in s||n in Ze))return!1;if(_e&&!Ae[t]&&A(le,t));else if(be&&A(ce,t));else if(!me[t]||Ae[t]){if(!(mt(e)&&(ye.tagNameCheck instanceof RegExp&&A(ye.tagNameCheck,e)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(e))&&(ye.attributeNameCheck instanceof RegExp&&A(ye.attributeNameCheck,t)||ye.attributeNameCheck instanceof Function&&ye.attributeNameCheck(t))||"is"===t&&ye.allowCustomizedBuiltInElements&&(ye.tagNameCheck instanceof RegExp&&A(ye.tagNameCheck,n)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))))return!1}else if(Fe[t]);else if(A(pe,g(n,de,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==y(n,"data:")||!Me[e])if(Ce&&!A(ue,g(n,de,"")));else if(n)return!1;return!0},mt=function(e){return e.indexOf("-")>0},gt=function(e){pt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:me};let s=t.length;for(;s--;){const o=t[s],{name:i,namespaceURI:a,value:l}=o,c=Je(i);let p="value"===i?l:v(l);if(n.attrName=c,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,pt("uponSanitizeAttribute",e,n),p=n.attrValue,n.forceKeepAttr)continue;if(lt(i,e),!n.keepAttr)continue;if(!we&&A(/\/>/i,p)){lt(i,e);continue}xe&&u([oe,ie,ae],(e=>{p=g(p,e," ")}));const f=Je(e.nodeName);if(ht(f,c,p)){if(!Ne||"id"!==c&&"name"!==c||(lt(i,e),p="user-content-"+p),J&&"object"==typeof $&&"function"==typeof $.getAttributeType)if(a);else switch($.getAttributeType(f,c)){case"TrustedHTML":p=J.createHTML(p);break;case"TrustedScriptURL":p=J.createScriptURL(p)}try{a?e.setAttributeNS(a,i,p):e.setAttribute(i,p),d(r.removed)}catch(e){}}}pt("afterSanitizeAttributes",e,null)},yt=function e(t){let n=null;const r=ut(t);for(pt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)pt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof c&&e(n.content),gt(n));pt("afterSanitizeShadowDOM",t,null)};return r.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,s=null,o=null,a=null;if(Ge=!e,Ge&&(e="\x3c!--\x3e"),"string"!=typeof e&&!dt(e)){if("function"!=typeof e.toString)throw b("toString is not a function");if("string"!=typeof(e=e.toString()))throw b("dirty is not a string, aborting")}if(!r.isSupported)return e;if(ke||tt(t),r.removed=[],"string"==typeof e&&(Le=!1),Le){if(e.nodeName){const t=Je(e.nodeName);if(!fe[t]||ve[t])throw b("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof C)n=ct("\x3c!----\x3e"),s=n.ownerDocument.importNode(e,!0),1===s.nodeType&&"BODY"===s.nodeName||"HTML"===s.nodeName?n=s:n.appendChild(s);else{if(!Re&&!xe&&!Se&&-1===e.indexOf("<"))return J&&Ie?J.createHTML(e):e;if(n=ct(e),!n)return Re?null:Ie?X:""}n&&Ee&&at(n.firstChild);const l=ut(Le?e:n);for(;o=l.nextNode();)ft(o)||(o.content instanceof c&&yt(o.content),gt(o));if(Le)return e;if(Re){if(Te)for(a=te.call(n.ownerDocument);n.firstChild;)a.appendChild(n.firstChild);else a=n;return(me.shadowroot||me.shadowrootmode)&&(a=re.call(i,a,!0)),a}let d=Se?n.outerHTML:n.innerHTML;return Se&&fe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&A(W,n.ownerDocument.doctype.name)&&(d="\n"+d),xe&&u([oe,ie,ae],(e=>{d=g(d,e," ")})),J&&Ie?J.createHTML(d):d},r.setConfig=function(){tt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),ke=!0},r.clearConfig=function(){Xe=null,ke=!1},r.isValidAttribute=function(e,t,n){Xe||tt({});const r=Je(e),s=Je(t);return ht(r,s,n)},r.addHook=function(e,t){"function"==typeof t&&(se[e]=se[e]||[],p(se[e],t))},r.removeHook=function(e){if(se[e])return d(se[e])},r.removeHooks=function(e){se[e]&&(se[e]=[])},r.removeAllHooks=function(){se={}},r}()}()},2232:function(e,t){var n,r;n=function e(){"use strict";var t="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t?t:{},n=!t.document&&!!t.postMessage,r=t.IS_PAPA_WORKER||!1,s={},o=0,i={parse:function(n,r){var a=(r=r||{}).dynamicTyping||!1;if(_(a)&&(r.dynamicTypingFunction=a,a={}),r.dynamicTyping=a,r.transform=!!_(r.transform)&&r.transform,r.worker&&i.WORKERS_SUPPORTED){var l=function(){if(!i.WORKERS_SUPPORTED)return!1;var n,r,a=(n=t.URL||t.webkitURL||null,r=e.toString(),i.BLOB_URL||(i.BLOB_URL=n.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ","(",r,")();"],{type:"text/javascript"})))),l=new t.Worker(a);return l.onmessage=g,l.id=o++,s[l.id]=l}();return l.userStep=r.step,l.userChunk=r.chunk,l.userComplete=r.complete,l.userError=r.error,r.step=_(r.step),r.chunk=_(r.chunk),r.complete=_(r.complete),r.error=_(r.error),delete r.worker,void l.postMessage({input:n,config:r,workerId:l.id})}var f=null;return i.NODE_STREAM_INPUT,"string"==typeof n?(n=function(e){return 65279===e.charCodeAt(0)?e.slice(1):e}(n),f=r.download?new c(r):new d(r)):!0===n.readable&&_(n.read)&&_(n.on)?f=new p(r):(t.File&&n instanceof File||n instanceof Object)&&(f=new u(r)),f.stream(n)},unparse:function(e,t){var n=!1,r=!0,s=",",o="\r\n",a='"',l=a+a,c=!1,u=null,d=!1;!function(){if("object"==typeof t){if("string"!=typeof t.delimiter||i.BAD_DELIMITERS.filter((function(e){return-1!==t.delimiter.indexOf(e)})).length||(s=t.delimiter),("boolean"==typeof t.quotes||"function"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes),"boolean"!=typeof t.skipEmptyLines&&"string"!=typeof t.skipEmptyLines||(c=t.skipEmptyLines),"string"==typeof t.newline&&(o=t.newline),"string"==typeof t.quoteChar&&(a=t.quoteChar),"boolean"==typeof t.header&&(r=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error("Option columns is empty");u=t.columns}void 0!==t.escapeChar&&(l=t.escapeChar+a),("boolean"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(d=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\-@\t\r].*$/)}}();var p=new RegExp(h(a),"g");if("string"==typeof e&&(e=JSON.parse(e)),Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return f(null,e,c);if("object"==typeof e[0])return f(u||Object.keys(e[0]),e,c)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||u),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:"object"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||"object"==typeof e.data[0]||(e.data=[e.data])),f(e.fields||[],e.data||[],c);throw new Error("Unable to serialize unrecognized input");function f(e,t,n){var i="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var a=Array.isArray(e)&&0=this._config.preview;if(r)t.postMessage({results:a,workerId:i.WORKER_ID,finished:c});else if(_(this._config.chunk)&&!n){if(this._config.chunk(a,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);a=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(a.data),this._completeResults.errors=this._completeResults.errors.concat(a.errors),this._completeResults.meta=a.meta),this._completed||!c||!_(this._config.complete)||a&&a.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),c||a&&a.meta.paused||this._nextChunk(),a}this._halted=!0},this._sendError=function(e){_(this._config.error)?this._config.error(e):r&&this._config.error&&t.postMessage({workerId:i.WORKER_ID,error:e,finished:!1})}}function c(e){var t;(e=e||{}).chunkSize||(e.chunkSize=i.RemoteChunkSize),l.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),n||(t.onload=b(this._chunkLoaded,this),t.onerror=b(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var r in e)t.setRequestHeader(r,e[r])}if(this._config.chunkSize){var s=this._start+this._config.chunkSize-1;t.setRequestHeader("Range","bytes="+this._start+"-"+s)}try{t.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===t.status&&this._chunkError()}},this._chunkLoaded=function(){4===t.readyState&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:t.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader("Content-Range");return null===t?-1:parseInt(t.substring(t.lastIndexOf("/")+1))}(t),this.parseChunk(t.responseText)))},this._chunkError=function(e){var n=t.statusText||e;this._sendError(new Error(n))}}function u(e){var t,n;(e=e||{}).chunkSize||(e.chunkSize=i.LocalChunkSize),l.call(this,e);var r="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,r?((t=new FileReader).onload=b(this._chunkLoaded,this),t.onerror=b(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function d(e){var t;l.call(this,e=e||{}),this.stream=function(e){return t=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,n=this._config.chunkSize;return n?(e=t.substring(0,n),t=t.substring(n)):(e=t,t=""),this._finished=!t,this.parseChunk(e)}}}function p(e){l.call(this,e=e||{});var t=[],n=!0,r=!1;this.pause=function(){l.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){l.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):n=!0},this._streamData=b((function(e){try{t.push("string"==typeof e?e:e.toString(this._config.encoding)),n&&(n=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}}),this),this._streamError=b((function(e){this._streamCleanUp(),this._sendError(e)}),this),this._streamEnd=b((function(){this._streamCleanUp(),r=!0,this._streamData("")}),this),this._streamCleanUp=b((function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)}),this)}function f(e){var t,n,r,s=Math.pow(2,53),o=-s,a=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,l=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,c=this,u=0,d=0,p=!1,f=!1,g=[],y={data:[],errors:[],meta:{}};if(_(e.step)){var v=e.step;e.step=function(t){if(y=t,w())C();else{if(C(),0===y.data.length)return;u+=t.data.length,e.preview&&u>e.preview?n.abort():(y.data=y.data[0],v(y,c))}}}function b(t){return"greedy"===e.skipEmptyLines?""===t.join("").trim():1===t.length&&0===t[0].length}function C(){return y&&r&&(S("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+i.DefaultDelimiter+"'"),r=!1),e.skipEmptyLines&&(y.data=y.data.filter((function(e){return!b(e)}))),w()&&function(){if(y)if(Array.isArray(y.data[0])){for(var t=0;w()&&t=g.length?"__parsed_extra":g[r]),e.transform&&(i=e.transform(i,o)),i=x(o,i),"__parsed_extra"===o?(s[o]=s[o]||[],s[o].push(i)):s[o]=i}return e.header&&(r>g.length?S("FieldMismatch","TooManyFields","Too many fields: expected "+g.length+" fields but parsed "+r,d+n):r=r.length/2?"\r\n":"\r"}(s,l)),r=!1,e.delimiter)_(e.delimiter)&&(e.delimiter=e.delimiter(s),y.meta.delimiter=e.delimiter);else{var c=function(t,n,r,s,o){var a,l,c,u;o=o||[",","\t","|",";",i.RECORD_SEP,i.UNIT_SEP];for(var d=0;d=a)return G(!0)}else for(B=u,u++;;){if(-1===(B=i.indexOf(t,B+1)))return f||C.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:b.length,index:u}),H();if(B===m-1)return H(i.substring(u,B).replace(M,t));if(t!==c||i[B+1]!==c){if(t===c||0===B||i[B-1]!==c){-1!==D&&D=a)return G(!0);break}C.push({type:"Quotes",code:"InvalidQuotes",message:"Trailing quote on quoted field is malformed",row:b.length,index:u}),B++}}else B++}return H();function q(e){b.push(e),x=u}function $(e){var t=0;if(-1!==e){var n=i.substring(B+1,e);n&&""===n.trim()&&(t=n.length)}return t}function H(e){return f||(void 0===e&&(e=i.substring(u)),w.push(e),u=m,q(w),A&&Y()),G()}function W(e){u=e,q(w),w=[],U=i.indexOf(r,u)}function G(e){return{data:b,errors:C,meta:{delimiter:n,linebreak:r,aborted:d,truncated:!!e,cursor:x+(p||0)}}}function Y(){o(G()),b=[],C=[]}},this.abort=function(){d=!0},this.getCharIndex=function(){return u}}function g(e){var t=e.data,n=s[t.workerId],r=!1;if(t.error)n.userError(t.error,t.file);else if(t.results&&t.results.data){var o={abort:function(){r=!0,y(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:v,resume:v};if(_(n.userStep)){for(var i=0;i{"use strict";var r=n(7200);function s(){}function o(){}o.resetWarningCache=s,e.exports=function(){function e(e,t,n,s,o,i){if(i!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:s};return n.PropTypes=n,n}},900:(e,t,n)=>{e.exports=n(7336)()},7200:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4108:(e,t,n)=>{"use strict";var r=n(1280),s=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,o={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:s,type:e,key:c,ref:u,props:o,_owner:a.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},7e3:(e,t,n)=>{"use strict";e.exports=n(4108)},3736:e=>{e.exports=function(e,t,n,r){var s=n?n.call(r,e,t):void 0;if(void 0!==s)return!!s;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var a=Object.prototype.hasOwnProperty.bind(t),l=0;l{"use strict";var t=[];function n(e){for(var n=-1,r=0;r{"use strict";var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},2940:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},9516:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7020:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var s=void 0!==n.layer;s&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,s&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var o=n.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},9296:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},3376:(e,t,n)=>{"use strict";n.d(t,{cp:()=>Ut});var r=function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n2||H(j)>3?"":" "}function Y(e,t){for(;--t&&F()&&!(j<48||j>102||j>57&&j<65||j>70&&j<97););return $(e,q()+(t<6&&32==z()&&32==F()))}function V(e){for(;F();)switch(j){case e:return L;case 34:case 39:34!==e&&39!==e&&V(j);break;case 40:41===e&&V(e);break;case 92:F()}return L}function K(e,t){for(;F()&&e+j!==57&&(e+j!==84||47!==z()););return"/*"+$(t,L-1)+"*"+A(47===e?e:F())}function Q(e){for(;!H(z());)F();return $(e,L)}function J(e,t){for(var n="",r=0;r6)switch(S(e,t+1)){case 109:if(45!==S(e,t+4))break;case 102:return w(e,/(.+:)(.+)-([^]+)/,"$1"+d+"$2-$3$1"+u+(108==S(e,t+3)?"$3":"$2-$3"))+e;case 115:return~x(e,"stretch")?Z(w(e,"stretch","fill-available"),t,n)+e:e}break;case 5152:case 5920:return w(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,(function(t,n,r,s,o,i,a){return c+n+":"+r+a+(s?c+n+"-span:"+(o?i:+i-+r)+a:"")+e}));case 4949:if(121===S(e,t+6))return w(e,":",":"+d)+e;break;case 6444:switch(S(e,45===S(e,14)?18:11)){case 120:return w(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+d+(45===S(e,14)?"inline-":"")+"box$3$1"+d+"$2$3$1"+c+"$2box$3")+e;case 100:return w(e,":",":"+c)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return w(e,"scroll-","scroll-snap-")+e}return e}function ee(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case h:return void(e.return=Z(e.value,e.length,n));case g:return J([M(e,{value:w(e.value,"@","@"+d)})],r);case f:if(e.length)return function(e,t){return e.map(t).join("")}(n=e.props,(function(t){switch(C(t,r=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":B(M(e,{props:[w(t,/:(read-\w+)/,":"+u+"$1")]})),B(M(e,{props:[t]})),b(e,{props:I(n,r)});break;case"::placeholder":B(M(e,{props:[w(t,/:(plac\w+)/,":"+d+"input-$1")]})),B(M(e,{props:[w(t,/:(plac\w+)/,":"+u+"$1")]})),B(M(e,{props:[w(t,/:(plac\w+)/,c+"input-$1")]})),B(M(e,{props:[t]})),b(e,{props:I(n,r)})}return""}))}}function te(e){return function(e){return D="",e}(ne("",null,null,null,[""],e=function(e){return P=N=1,O=E(D=e),L=0,[]}(e),0,[0],e))}function ne(e,t,n,r,s,o,i,a,l){for(var c=0,u=0,d=i,p=0,f=0,h=0,m=1,g=1,y=1,v=0,b="",_=s,C=o,k=r,R=b;g;)switch(h=v,v=F()){case 40:if(108!=h&&58==S(R,d-1)){-1!=x(R+=w(W(v),"&","&\f"),"&\f")&&(y=-1);break}case 34:case 39:case 91:R+=W(v);break;case 9:case 10:case 13:case 32:R+=G(h);break;case 92:R+=Y(q()-1,7);continue;case 47:switch(z()){case 42:case 47:T(se(K(F(),q()),t,n,l),l);break;default:R+="/"}break;case 123*m:a[c++]=E(R)*y;case 125*m:case 59:case 0:switch(v){case 0:case 125:g=0;case 59+u:-1==y&&(R=w(R,/\f/g,"")),f>0&&E(R)-d&&T(f>32?oe(R+";",r,n,d-1,l):oe(w(R," ","")+";",r,n,d-2,l),l);break;case 59:R+=";";default:if(T(k=re(R,t,n,c,u,s,a,b,_=[],C=[],d,o),o),123===v)if(0===u)ne(R,t,k,k,_,o,d,a,C);else switch(99===p&&110===S(R,3)?100:p){case 100:case 108:case 109:case 115:ne(e,k,k,r&&T(re(e,k,k,0,0,s,a,b,s,_=[],d,C),C),s,C,d,a,r?_:C);break;default:ne(R,k,k,k,[""],C,0,a,C)}}c=u=f=0,m=y=1,b=R="",d=i;break;case 58:d=1+E(R),f=h;default:if(m<1)if(123==v)--m;else if(125==v&&0==m++&&125==(j=L>0?S(D,--L):0,N--,10===j&&(N=1,P--),j))continue;switch(R+=A(v),v*m){case 38:y=u>0?1:(R+="\f",-1);break;case 44:a[c++]=(E(R)-1)*y,y=1;break;case 64:45===z()&&(R+=W(F())),p=z(),u=d=E(b=R+=Q(q())),v++;break;case 45:45===h&&2==E(R)&&(m=0)}}return o}function re(e,t,n,r,s,o,i,a,l,c,u,d){for(var p=s-1,h=0===s?o:[""],m=R(h),g=0,y=0,A=0;g0?h[b]+" "+C:w(C,/&\f/g,h[b])))&&(l[A++]=x);return U(e,t,n,0===s?f:a,l,c,u,d)}function se(e,t,n,r){return U(e,t,n,p,A(j),k(e,2,-2),0,r)}function oe(e,t,n,r,s){return U(e,t,n,h,k(e,0,r),k(e,r+1,-1),r,s)}const ie={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var ae="undefined"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",le="undefined"!=typeof window&&"HTMLElement"in window,ce=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY&&"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY),ue=(new Set,Object.freeze([])),de=Object.freeze({}),pe=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),fe=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,he=/(^-|-$)/g;function me(e){return e.replace(fe,"-").replace(he,"")}var ge=/(a)(d)/gi,ye=function(e){return String.fromCharCode(e+(e>25?39:97))};function ve(e){var t,n="";for(t=Math.abs(e);t>52;t=t/52|0)n=ye(t%52)+n;return(ye(t%52)+n).replace(ge,"$1-$2")}var Ae,be=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},_e=function(e){return be(5381,e)};function Ce(e){return"string"==typeof e&&!0}var we="function"==typeof Symbol&&Symbol.for,xe=we?Symbol.for("react.memo"):60115,Se=we?Symbol.for("react.forward_ref"):60112,ke={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Ee={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Re={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},Te=((Ae={})[Se]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},Ae[xe]=Re,Ae);function Ie(e){return("type"in(t=e)&&t.type.$$typeof)===xe?Re:"$$typeof"in e?Te[e.$$typeof]:ke;var t}var Pe=Object.defineProperty,Ne=Object.getOwnPropertyNames,Oe=Object.getOwnPropertySymbols,Le=Object.getOwnPropertyDescriptor,je=Object.getPrototypeOf,De=Object.prototype;function Ue(e,t,n){if("string"!=typeof t){if(De){var r=je(t);r&&r!==De&&Ue(e,r,n)}var s=Ne(t);Oe&&(s=s.concat(Oe(t)));for(var o=Ie(e),i=Ie(t),a=0;a0?" Args: ".concat(t.join(", ")):""))}var Ge=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}return e.prototype.indexOfGroup=function(e){for(var t=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,r=n.length,s=r;e>=s;)if((s<<=1)<0)throw We(16,"".concat(e));this.groupSizes=new Uint32Array(s),this.groupSizes.set(n),this.length=s;for(var o=r;o=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],r=this.indexOfGroup(e),s=r+n,o=r;o=0){var n=document.createTextNode(t);return this.element.insertBefore(n,this.nodes[e]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},e.prototype.getRule=function(e){return e0&&(l+="".concat(e,","))})),r+="".concat(i).concat(a,'{content:"').concat(l,'"}').concat("/*!sc*/\n")},o=0;o0?".".concat(t):e},u=l.slice();u.push((function(e){e.type===f&&e.value.includes("&")&&(e.props[0]=e.props[0].replace(ut,n).replace(r,c))})),i.prefix&&u.push(ee),u.push(X);var d=function(e,s,o,a){void 0===s&&(s=""),void 0===o&&(o=""),void 0===a&&(a="&"),t=a,n=s,r=new RegExp("\\".concat(n,"\\b"),"g");var l=e.replace(dt,""),c=te(o||s?"".concat(o," ").concat(s," { ").concat(l," }"):l);i.namespace&&(c=pt(c,i.namespace));var d,p,f,h=[];return J(c,(d=u.concat((f=function(e){return h.push(e)},function(e){e.root||(e=e.return)&&f(e)})),p=R(d),function(e,t,n,r){for(var s="",o=0;o="A"&&e<="Z"};function Ct(e){for(var t="",n=0;n>>0);if(!t.hasNameForId(this.componentId,o)){var i=n(s,".".concat(o),void 0,this.componentId);t.insertRules(this.componentId,o,i)}r=Fe(r,o),this.staticRulesId=o}else{for(var a=be(this.baseHash,n.hash),l="",c=0;c>>0);t.hasNameForId(this.componentId,p)||t.insertRules(this.componentId,p,n(l,".".concat(p),void 0,this.componentId)),r=Fe(r,p)}}return r},e}(),Tt=i().createContext(void 0);Tt.Consumer;var It={};function Pt(e,t,n){var s=Be(e),a=e,l=!Ce(e),c=t.attrs,u=void 0===c?ue:c,d=t.componentId,p=void 0===d?function(e,t){var n="string"!=typeof e?"sc":me(e);It[n]=(It[n]||0)+1;var r="".concat(n,"-").concat(function(e){return ve(_e(e)>>>0)}("6.1.1"+n+It[n]));return t?"".concat(t,"-").concat(r):r}(t.displayName,t.parentComponentId):d,f=t.displayName,h=void 0===f?function(e){return Ce(e)?"styled.".concat(e):"Styled(".concat(function(e){return e.displayName||e.name||"Component"}(e),")")}(e):f,m=t.displayName&&t.componentId?"".concat(me(t.displayName),"-").concat(t.componentId):t.componentId||p,g=s&&a.attrs?a.attrs.concat(u).filter(Boolean):u,y=t.shouldForwardProp;if(s&&a.shouldForwardProp){var v=a.shouldForwardProp;if(t.shouldForwardProp){var A=t.shouldForwardProp;y=function(e,t){return v(e,t)&&A(e,t)}}else y=v}var b=new Rt(n,m,s?a.componentStyle:void 0);function _(e,t){return function(e,t,n){var s=e.attrs,a=e.componentStyle,l=e.defaultProps,c=e.foldedComponentIds,u=e.styledComponentId,d=e.target,p=i().useContext(Tt),f=vt(),h=e.shouldForwardProp||f.shouldForwardProp,m=function(e,t,n){for(var s,o=r(r({},t),{className:void 0,theme:n}),i=0;i2&&ct.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,r)}}(),function(){function e(){var e=this;this._emitSheetCSS=function(){var t=e.instance.toString(),n=nt(),r=ze([n&&'nonce="'.concat(n,'"'),"".concat(ae,'="true"'),"".concat("data-styled-version",'="').concat("6.1.1",'"')].filter(Boolean)," ");return"")},this.getStyleTags=function(){if(e.sealed)throw We(2);return e._emitSheetCSS()},this.getStyleElement=function(){var t;if(e.sealed)throw We(2);var n=((t={})[ae]="",t["data-styled-version"]="6.1.1",t.dangerouslySetInnerHTML={__html:e.instance.toString()},t),s=nt();return s&&(n.nonce=s),[i().createElement("style",r({},n,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new ct({isServer:!0}),this.sealed=!1}e.prototype.collectStyles=function(e){if(this.sealed)throw We(2);return i().createElement(At,{sheet:this.instance},e)},e.prototype.interleaveWithNodeStream=function(e){throw We(3)}}(),"__sc-".concat(ae,"__")},4928:(e,t,n)=>{"use strict";n.d(t,{default:()=>d});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(7720);const l=i.cp.div` + height: auto; + width: 100%; +`,c=({src:e})=>(0,r.jsx)(l,{children:(0,r.jsx)("audio",{className:"edit-audio-preview",controls:!0,src:e})});c.propTypes={src:o().string.isRequired};const u=({className:e,onReset:t,onUpdate:n,onUpdateURL:s,value:o,valueURL:i})=>(0,r.jsx)(a.MediaPicker,{allowedTypes:["audio"],className:e,icon:"format-audio",onReset:t,onUpdate:n,onUpdateURL:s,preview:c,value:o,valueURL:i});u.defaultProps={className:"",onUpdateURL:null,valueURL:""},u.propTypes={className:o().string,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,value:o().number.isRequired,valueURL:o().string};const d=u},2312:(e,t,n)=>{"use strict";n.d(t,{default:()=>l});var r=n(7e3),s=n(900),o=n.n(s),i=n(7287);const a=({label:e,value:t,options:n,onChange:s})=>(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.BaseControl,{label:e}),n.map((e=>(0,r.jsx)(i.CheckboxControl,{label:e.label,checked:t.includes(e.value),onChange:n=>{s(n?[...t,e.value]:[...t.filter((t=>t!==e.value))])}})))]});a.propTypes={label:o().string.isRequired,value:o().arrayOf(o().string).isRequired,options:o().arrayOf(o().shape({label:o().string.isRequired,value:o().string.isRequired})).isRequired,onChange:o().func.isRequired};const l=a},8312:(e,t,n)=>{"use strict";n.d(t,{default:()=>u});var r=n(7e3),s=n(1280),o=n.n(s),i=n(3396),a=n(900),l=n.n(a),c=n(5328);class u extends o().PureComponent{static handleSubmit(e){e.preventDefault()}constructor(e){super(e),this.handleChange=this.handleChange.bind(this),this.state={error:"",success:""}}handleChange(e){const{attributeName:t,callback:n,setAttributes:r}=this.props;e.target.files&&e.target.files[0]&&(0,c.parseCSVFile)(e.target.files[0]).then((e=>n?n(e):e)).then((e=>{Array.isArray(e)&&e.length>0?(this.setState({error:"",success:(0,i.__)("Successfully read CSV data.","alley-scripts")}),r({[t]:JSON.stringify(e)})):this.setState({error:(0,i.__)("Could not map CSV data. Please check the source file to ensure that it has the correct structure.","alley-scripts"),success:""})})).catch((e=>{this.setState({error:e,success:""})}))}render(){const{error:e="",success:t=""}=this.state;return(0,r.jsxs)("div",{className:"alley-scripts-block-csv-uploader",children:[(0,r.jsx)("h2",{children:(0,i.__)("Upload CSV","alley-scripts")}),(0,r.jsxs)("form",{onSubmit:this.handleSubmit,children:[""!==e?(0,r.jsxs)("div",{style:{color:"#c00"},children:[(0,r.jsx)("strong",{children:(0,i.__)("Error:","alley-scripts")})," ",e]}):null,""!==t?(0,r.jsxs)("div",{style:{color:"#0c0"},children:[(0,r.jsx)("strong",{children:(0,i.__)("Success:","alley-scripts")})," ",t]}):null,(0,r.jsx)("div",{children:(0,r.jsxs)("label",{htmlFor:"alley-scripts-block-csv-uploader-file",children:[(0,r.jsx)("p",{children:(0,i.__)("Select a file to load data.","alley-scripts")}),(0,r.jsx)("input",{id:"alley-scripts-block-csv-uploader-file",onChange:this.handleChange,type:"file"})]})})]})]})}}u.defaultProps={callback:null},u.propTypes={attributeName:l().string.isRequired,callback:l().func,setAttributes:l().func.isRequired}},8348:(e,t,n)=>{"use strict";n.d(t,{default:()=>p});var r=n(7e3),s=n(3396),o=n(900),i=n.n(o),a=n(3376),l=n(7720);const c=a.cp.div` + box-sizing: border-box; + flex-shrink: 0; + height: auto; + max-height: 1450px; + max-width: 1450px; + min-height: 20px; + min-width: 20px; + position: relative; + width: auto; +`,u=({src:e})=>(0,r.jsx)(c,{children:(0,r.jsx)("img",{alt:(0,s.__)("Edit image","alley-scripts"),className:"edit-image-preview",src:e,title:(0,s.__)("Edit image","alley-scripts")})});u.propTypes={src:i().string.isRequired};const d=({className:e,imageSize:t,displayControlsInToolbar:n,onReset:s,onUpdate:o,onUpdateURL:i,value:a,valueURL:c})=>(0,r.jsx)(l.MediaPicker,{allowedTypes:["image"],className:e,icon:"format-image",imageSize:t,displayControlsInToolbar:n,onReset:s,onUpdate:o,onUpdateURL:i,preview:u,value:a,valueURL:c});d.defaultProps={className:"",imageSize:"thumbnail",displayControlsInToolbar:!1,onUpdateURL:null,valueURL:""},d.propTypes={className:i().string,imageSize:i().string,displayControlsInToolbar:i().bool,onReset:i().func.isRequired,onUpdate:i().func.isRequired,onUpdateURL:i().func,value:i().number.isRequired,valueURL:i().string};const p=d},7720:(e,t,n)=>{"use strict";n.d(t,{AudioPicker:()=>r.default,CSVUploader:()=>o.default,Checkboxes:()=>s.default,ImagePicker:()=>i.default,MediaPicker:()=>a.default,PostPicker:()=>c.default,PostSelector:()=>u.default,SafeHtml:()=>l.default,Selector:()=>d.default,Sortable:()=>p.default,SortableItem:()=>f.default,TermSelector:()=>h.default,VideoPicker:()=>m.default});var r=n(4928),s=n(2312),o=n(8312),i=n(8348),a=n(5680),l=n(9160),c=n(4808),u=n(8800),d=n(9064),p=n(8504),f=n(1917),h=n(668),m=n(5316)},5680:(e,t,n)=>{"use strict";n.d(t,{default:()=>m});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(9528),l=n(7287),c=n(7752),u=n(3396),d=n(5328);const p=i.cp.div` + display: block; + position: relative; +`,f=i.cp.div` + background: white; + border: 1px solid black; + padding: 1em; +`,h=({allowedTypes:e,className:t,icon:n,imageSize:s,displayControlsInToolbar:o,onReset:i,onUpdate:h,onUpdateURL:m,preview:g,value:y,valueURL:v})=>{const{media:A}=(0,c.useSelect)((e=>({media:y?e("core").getMedia(y):void 0})),[y]);if(0!==y&&null===A)return(0,r.jsx)(l.Spinner,{});const b=A?(0,d.getMediaUrl)(A,s):v;return b?(0,r.jsxs)(p,{className:t,children:[g?(0,r.jsx)(g,{src:b}):(0,r.jsxs)(f,{className:"alley-scripts-media-picker__preview",children:[(0,r.jsx)("p",{children:(0,u.__)("Selected file:","alley-scripts")}),(0,r.jsx)("p",{children:(0,r.jsx)("a",{href:b,children:b})})]}),o?(0,r.jsx)(a.BlockControls,{group:"other",children:(0,r.jsx)(a.MediaReplaceFlow,{name:(0,u.__)("Edit Media","alley-scripts"),mediaId:y,mediaURL:b,allowedTypes:e,onSelect:h,onSelectURL:m,children:(0,r.jsx)(l.ToolbarButton,{isDestructive:!0,text:(0,u.__)("Remove","alley-scripts"),onClick:i})})}):(0,r.jsx)(l.Button,{variant:"primary",onClick:i,children:(0,u.__)("Reset","alley-scripts")})]}):(0,r.jsx)(p,{className:t,children:(0,r.jsx)(a.MediaPlaceholder,{allowedTypes:e,disableMediaButtons:!!v,icon:(0,r.jsx)(a.BlockIcon,{icon:n}),onSelect:h,onSelectURL:m,value:{id:y,src:b}})})};h.defaultProps={allowedTypes:[],className:"",icon:"format-aside",imageSize:"thumbnail",displayControlsInToolbar:!1,onUpdateURL:null,preview:null,valueURL:""},h.propTypes={allowedTypes:o().arrayOf(o().string),className:o().string,icon:o().string,imageSize:o().string,displayControlsInToolbar:o().bool,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,preview:o().element,value:o().number.isRequired,valueURL:o().string};const m=h},4808:(e,t,n)=>{"use strict";n.d(t,{default:()=>F});var r=n(7e3),s=n(1280),o=n(3376),i=n(7287),a=n(3396),l=n(7204),c=n(2e3),u=n(2108),d=n.n(u),p=n(7020),f=n.n(p),h=n(7240),m=n.n(h),g=n(9516),y=n.n(g),v=n(2940),A=n.n(v),b=n(9296),_=n.n(b),C=n(9680),w={};w.styleTagTransform=_(),w.setAttributes=y(),w.insert=m().bind(null,"head"),w.domAPI=f(),w.insertStyleElement=A(),d()(C.c,w),C.c&&C.c.locals&&C.c.locals;var x=n(4632),S=n.n(x),k=n(6484),E=n.n(k),R=n(7424),T={};T.styleTagTransform=_(),T.setAttributes=y(),T.insert=m().bind(null,"head"),T.domAPI=f(),T.insertStyleElement=A(),d()(R.c,T),R.c&&R.c.locals&&R.c.locals;const I=window.wp.htmlEntities;var P=n(9160);const N=o.cp.div` + align-items: center; + gap: 4px; + overflow-wrap: anywhere; + display: flex; + flex-direction: column; + justify-content: center; + padding: 0.5rem 0.75rem; +`,O=({title:e,postType:t,attachmentID:n})=>{const s=(0,c.useMedia)(n),o=s?.media_details?.sizes?.thumbnail?.source_url,i=s?.alt_text??"";return(0,r.jsxs)(N,{children:[o?(0,r.jsx)("img",{style:{maxWidth:"100%",height:"auto"},loading:"lazy",src:o,alt:i}):null,(0,r.jsx)(P.default,{html:(0,I.decodeEntities)(e),className:"post-picker-result-title",tag:"strong"}),(0,a.sprintf)(" (%s)",t)]})},L=({baseUrl:e,searchRender:t,selected:n,setSelected:o,suppressPostIds:c=[]})=>{const[u,d]=(0,s.useState)(!1),[p,f]=(0,s.useState)([]),[h,m]=(0,s.useState)(!1),[g,y]=(0,s.useState)(0),[v,A]=(0,s.useState)({searchValue:"",page:1}),b=(0,s.useCallback)((async(t,n=!1)=>{if(t.searchValue&&t.searchValue.length<=2)return;const r=function(){let n=(0,l.addQueryArgs)(e,{page:t.page,_embed:1,exclude:c.join(",")});return t.searchValue&&t.searchValue.length>2&&(n=(0,l.addQueryArgs)(n,{search:t.searchValue})),n}();d(!0);const s=await S()({path:r,parse:!1});y(parseInt(s.headers.get("X-WP-TotalPages"),10));const o=await s.json();let i=o;t.page>1&&(i=[...p,...o]),n||(f(i),d(!1))}),[p,e,c]);return(0,s.useEffect)((()=>{let e=!1;return h||(m(!0),b(v,e)),()=>{e=!0}}),[b,h,v]),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.TextControl,{value:v.searchValue,placeholder:(0,a.__)("Search...","alley-scripts"),label:(0,a.__)("Search","alley-scripts"),onChange:e=>{const t={...v,searchValue:e,page:1};A(t),b(t)}}),(0,r.jsxs)("div",{className:"alley-scripts-post-picker__post-list",children:[p?p.map((e=>(0,r.jsx)(i.Button,{className:E()({"alley-scripts-post-picker__post":!0,"is-selected":e.id===n}),onClick:()=>o(e.id),children:t?t(e):(0,r.jsx)(O,{title:e.title,postType:e.subtype,attachmentID:e?._embedded?.self[0]?.featured_media})},e.id))):null,u?(0,r.jsx)(i.Spinner,{}):null,g>0&&v.page{const e={...v,page:v.page+1};A(e),b(e)},children:(0,a.__)("Load More","alley-scripts")})}):null]})]})},j=({baseUrl:e,closeModal:t,modalTitle:n,onUpdate:o,searchRender:l,suppressPostIds:c=[]})=>{const[u,d]=(0,s.useState)();return(0,r.jsxs)(i.Modal,{className:"alley-scripts-post-picker__modal",isDismissible:!0,title:n,onRequestClose:t,closeButtonLabel:"Close",children:[(0,r.jsx)(L,{baseUrl:e,selected:u??0,setSelected:d,searchRender:l,suppressPostIds:c}),(0,r.jsxs)("div",{className:"alley-scripts-post-picker__buttons",children:[(0,r.jsx)(i.Button,{variant:"secondary",onClick:t,children:(0,a.__)("Cancel","alley-scripts")}),(0,r.jsx)(i.Button,{variant:"primary",onClick:()=>{u&&(o(u),t())},disabled:!u,children:(0,a.__)("Select","alley-scripts")})]})]})};var D=n(3800),U={};U.styleTagTransform=_(),U.setAttributes=y(),U.insert=m().bind(null,"head"),U.domAPI=f(),U.insertStyleElement=A(),d()(D.c,U),D.c&&D.c.locals&&D.c.locals;const M=o.cp.div` + display: block; + position: relative; +`,B=o.cp.div` + border: 1px solid #eee; + display: flex; + flex-direction: column; + margin: 5px 0; + padding: 0.5rem 0.75rem; + text-align: center; +`,F=({allowedTypes:e,className:t,getPostType:n,modalTitle:o=(0,a.__)("Select Post","alley-scripts"),onReset:u,onUpdate:d,params:p={},previewLookup:f,previewRender:h,replaceText:m=(0,a.__)("Replace","alley-scripts"),resetText:g=(0,a.__)("Reset","alley-scripts"),searchEndpoint:y="/wp/v2/search",searchRender:v,selectText:A=(0,a.__)("Select","alley-scripts"),suppressPostIds:b=[],title:_="",value:C=0})=>{const[w,x]=(0,s.useState)(!1),S=(0,l.addQueryArgs)(y,{type:"post",subtype:e??"any",...p}),k=f?f(C):(0,c.usePostById)(C,n),{featured_media:E,title:{rendered:R=""}={},type:T=""}=k||{},I=()=>{x(!0)},P=()=>(0,r.jsxs)(i.ButtonGroup,{children:[(0,r.jsx)(i.Button,{variant:"secondary",onClick:u,style:{margin:"0 4px"},children:g}),(0,r.jsx)(i.Button,{variant:"secondary",onClick:I,style:{margin:"0 4px"},children:m})]});return 0!==C&&null===k?(0,r.jsx)(i.Spinner,{}):(0,r.jsxs)(M,{className:t,children:[_?(0,r.jsx)("h4",{children:_}):null,0!==C&&void 0===k?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.Notice,{status:"error",isDismissible:!1,className:"post-picker-notice",children:(0,r.jsx)("p",{children:(0,a.sprintf)((0,a.__)("Post %d is no longer available; it has been unpublished or deleted","alley-scripts"),C)})}),P()]}):null,0!==C&&void 0!==k?(0,r.jsxs)(r.Fragment,{children:[void 0!==h?h(k):(0,r.jsx)(B,{children:(0,r.jsx)(O,{title:R,postType:T,attachmentID:E})}),P()]}):null,0===C?(0,r.jsx)(i.Button,{onClick:I,variant:"secondary",children:A}):null,w?(0,r.jsx)(j,{closeModal:()=>{x(!1)},baseUrl:S,modalTitle:o,onUpdate:d,searchRender:v,suppressPostIds:b}):null]})}},8800:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(900),o=n.n(s),i=n(3396),a=n(7720);const l=({className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d})=>(0,r.jsx)(a.Selector,{type:"post",className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d});l.defaultProps={className:"",emptyLabel:(0,i.__)("No posts found","alley-scripts"),label:(0,i.__)("Search for posts","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,i.__)("Search for posts","alley-scripts"),subTypes:[],selected:[],threshold:3},l.propTypes={className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const c=l},9160:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(6595),o=n.n(s),i=n(900),a=n.n(i);const l=({className:e,html:t,tag:n})=>(0,r.jsx)(n,{className:e,dangerouslySetInnerHTML:{__html:o().sanitize(t)}});l.defaultProps={className:""},l.propTypes={className:a().string,html:a().string.isRequired,tag:a().string.isRequired};const c=l},9064:(e,t,n)=>{"use strict";n.d(t,{default:()=>M});var r=n(7e3),s=n(900),o=n.n(s),i=n(1280),a=n(4632),l=n.n(a),c=n(6484),u=n.n(c),d=n(7287),p=n(3396),f=n(7204);const h={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let m;const g=new Uint8Array(16);function y(){if(!m&&(m="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!m))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(g)}const v=[];for(let e=0;e<256;++e)v.push((e+256).toString(16).slice(1));const A=function(e,t,n){if(h.randomUUID&&!t&&!e)return h.randomUUID();const r=(e=e||{}).random||(e.rng||y)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return function(e,t=0){return v[e[t+0]]+v[e[t+1]]+v[e[t+2]]+v[e[t+3]]+"-"+v[e[t+4]]+v[e[t+5]]+"-"+v[e[t+6]]+v[e[t+7]]+"-"+v[e[t+8]]+v[e[t+9]]+"-"+v[e[t+10]]+v[e[t+11]]+v[e[t+12]]+v[e[t+13]]+v[e[t+14]]+v[e[t+15]]}(r)};var b=n(2e3);const _=({emptyLabel:e,error:t,id:n,isOpen:s,labelledbyId:o,loading:i,onSelect:a,options:l,selectedItems:c,threshold:f,value:h})=>{if(!i&&(""===h||f>h.length))return null;let m="",g="";return i?(m="loading",g=(0,p.__)("Loading...","alley-scripts")):t?(m="error",g=t):i||0!==l.length||(m="no-posts",g=e),i||!i&&(h&&0===l.length||t)?(0,r.jsx)("div",{"aria-busy":!0,className:u()("autocomplete__dropdown",{"autocomplete__dropdown--is-open":s}),children:(0,r.jsx)("div",{className:u()("autocomplete__dropdown--notice",`autocomplete__${m}`),children:g})}):(0,r.jsx)("div",{className:u()("autocomplete__dropdown",{"autocomplete__dropdown--is-open":s}),children:(0,r.jsx)("ul",{role:"listbox","aria-labelledby":o,id:n,className:u()("autocomplete__dropdown--results","autocomplete__list"),children:l.map((e=>(0,r.jsx)("li",{className:"autocomplete__list--item",children:(0,r.jsx)(d.Button,{onClick:()=>a(e),type:"button",disabled:c.some((t=>t.id===e.id)),isTertiary:!0,children:e.title})},e.id)))})})};_.propTypes={emptyLabel:o().string.isRequired,error:o().string.isRequired,id:o().string.isRequired,isOpen:o().bool.isRequired,labelledbyId:o().string.isRequired,loading:o().bool.isRequired,options:o().arrayOf(o().shape({label:o().string,value:o().string})).isRequired,onSelect:o().func.isRequired,selectedItems:o().shape([]).isRequired,threshold:o().number.isRequired,value:o().string.isRequired};const C=_;var w=n(2108),x=n.n(w),S=n(7020),k=n.n(S),E=n(7240),R=n.n(E),T=n(9516),I=n.n(T),P=n(2940),N=n.n(P),O=n(9296),L=n.n(O),j=n(5500),D={};D.styleTagTransform=L(),D.setAttributes=I(),D.insert=R().bind(null,"head"),D.domAPI=k(),D.insertStyleElement=N(),x()(j.c,D),j.c&&j.c.locals&&j.c.locals;const U=({type:e,className:t,emptyLabel:n,label:s,maxPages:o,multiple:a,onSelect:c,placeholder:p,subTypes:h,selected:m,threshold:g})=>{const y=A(),[v,_]=(0,i.useState)(""),[w,x]=(0,i.useState)([]),[S,k]=(0,i.useState)(!1),[E,R]=(0,i.useState)(!1),[T,I]=(0,i.useState)(""),[P,N]=(0,i.useState)([]),O=(0,i.useRef)(),L=(0,b.useDebounce)(T,750),j=(0,i.useCallback)((async(t=1)=>{if(L.length0?h.join(","):"any",type:e});await l()({path:r,parse:!1}).then((e=>{const t=parseInt(e.headers.get("X-WP-TotalPages"),10);return n=t>o?o:t,e.json()})).then((e=>{x((t=>[...t,...e])),R(!1),(n&&n>t||t>=1&&a&&P.length>0)&&j(t+1)})).catch((e=>_(e.message)))}),[L,e,o,a,h,P.length,g]);(0,i.useEffect)((()=>{N(m)}),[m]),(0,i.useEffect)((()=>{L&&g<=L.length?j():x([])}),[L,j,g]);const D=e=>{k(O.current.contains(e.target))},U=e=>{"Escape"===e.key&&k(!1)};(0,i.useEffect)((()=>(document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)))),(0,i.useEffect)((()=>(O&&document.addEventListener("mousedown",D),()=>document.removeEventListener("mousedown",D))));const M=e=>{let t=[];if(P.some((t=>t.id===e.id))){const n=P.findIndex((t=>t.id===e.id));t=[...P.slice(0,n),...P.slice(n+1,P.length)]}else a?t=[...P,e]:(t=[e],k(!1));N(t),c(t)};return(0,r.jsx)("form",{className:"autocomplete__component",onSubmit:e=>e.preventDefault(),children:(0,r.jsxs)("div",{className:u()("components-base-control","autocomplete-base-control",t),ref:O,children:[(0,r.jsxs)("div",{"aria-expanded":S,"aria-haspopup":"listbox","aria-owns":`listbox-${y}`,className:u()("components-base-control__field","autocomplete-base-control__field"),role:"combobox",children:[(0,r.jsx)("label",{className:u()("components-base-control__label","autocomplete-base-control__label"),htmlFor:`autocomplete-${y}`,children:(0,r.jsx)("div",{children:s})}),P.length>0?(0,r.jsx)("ul",{role:"listbox","aria-labelledby":`autocomplete-${y}`,id:`selected-items-${y}`,className:u()("autocomplete__selection--results","autocomplete__selection-list"),children:P.map((e=>(0,r.jsx)("li",{className:"autocomplete__selection-list--item",children:(0,r.jsx)(d.Button,{className:"autocomplete__selection-list--item--button",isSecondary:!0,isSmall:!0,onClick:()=>M(e),type:"button",children:e.title})},e.title)))}):null,(0,r.jsx)("input",{"aria-autocomplete":"list",autoComplete:"off",className:u()("components-text-control__input","autocomplete-text-control__input",{"autocomplete-text-control__input--working":S}),id:`autocomplete-${y}`,onChange:e=>I(e.target.value),onFocus:()=>k(!0),placeholder:p,type:"text",value:T})]}),(0,r.jsx)(C,{emptyLabel:n,error:v,labelledById:`autocomplete-${y}`,id:`listbox-${y}`,isOpen:S,loading:E&&L,onSelect:M,options:w,selectedItems:P,threshold:g,value:L})]})})};U.defaultProps={type:"post",className:"",emptyLabel:(0,p.__)("No items found","alley-scripts"),label:(0,p.__)("Search for items","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,p.__)("Search for items","alley-scripts"),subTypes:[],selected:[],threshold:3},U.propTypes={type:o().string,className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const M=U},1917:(e,t,n)=>{"use strict";n.d(t,{default:()=>i});var r=n(7e3),s=n(7287),o=n(3396);function i({children:e,index:t,list:n,setList:i}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(s.Button,{disabled:0===t,icon:"arrow-up-alt2",label:(0,o.__)("Move up","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t-1,0,e.splice(t,1)[0]),i(e)}}),(0,r.jsx)(s.Button,{disabled:t===n.length-1,icon:"arrow-down-alt2",label:(0,o.__)("Move down","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t+1,0,e.splice(t,1)[0]),i(e)}}),(0,r.jsx)(s.Button,{icon:"trash",label:(0,o.__)("Remove","alley-scripts"),onClick:()=>{const e=[...n];e.splice(t,1),i(e)}})]}),(0,r.jsx)("div",{children:e})]})}},8504:(e,t,n)=>{"use strict";n.d(t,{default:()=>i});var r=n(7e3),s=n(7287),o=n(3396);function i({children:e,emptyItem:t,list:n,setList:i}){return(0,r.jsxs)(r.Fragment,{children:[e,(0,r.jsx)("div",{style:{margin:"1em 0"},children:(0,r.jsx)(s.Button,{icon:"plus",onClick:()=>i([...n,t]),variant:"primary",children:(0,o.__)("Add Item","alley-scripts")})})]})}},668:(e,t,n)=>{"use strict";n.d(t,{default:()=>c});var r=n(7e3),s=n(900),o=n.n(s),i=n(3396),a=n(7720);const l=({className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d})=>(0,r.jsx)(a.Selector,{type:"term",className:e,emptyLabel:t,label:n,maxPages:s,multiple:o,onSelect:i,placeholder:l,subTypes:c,selected:u,threshold:d});l.defaultProps={className:"",emptyLabel:(0,i.__)("No terms found","alley-scripts"),label:(0,i.__)("Search for terms","alley-scripts"),maxPages:5,multiple:!1,placeholder:(0,i.__)("Search for terms","alley-scripts"),subTypes:[],selected:[],threshold:3},l.propTypes={className:o().string,emptyLabel:o().string,label:o().string,maxPages:o().number,multiple:o().bool,onSelect:o().func.isRequired,placeholder:o().string,subTypes:o().arrayOf(o().string),selected:o().arrayOf([o().shape({id:o().number,title:o().string})]),threshold:o().number};const c=l},5316:(e,t,n)=>{"use strict";n.d(t,{default:()=>d});var r=n(7e3),s=n(900),o=n.n(s),i=n(3376),a=n(7720);const l=i.cp.div` + height: auto; + width: 100%; +`,c=({src:e})=>(0,r.jsx)(l,{children:(0,r.jsx)("video",{className:"edit-video-preview",controls:!0,src:e})});c.propTypes={src:o().string.isRequired};const u=({className:e,onReset:t,onUpdate:n,onUpdateURL:s,value:o,valueURL:i})=>(0,r.jsx)(a.MediaPicker,{allowedTypes:["video"],className:e,icon:"format-video",onReset:t,onUpdate:n,onUpdateURL:s,preview:c,value:o,valueURL:i});u.defaultProps={className:"",onUpdateURL:null,valueURL:""},u.propTypes={className:o().string,onReset:o().func.isRequired,onUpdate:o().func.isRequired,onUpdateURL:o().func,value:o().number.isRequired,valueURL:o().string};const d=u},2e3:(e,t,n)=>{"use strict";n.d(t,{useCurrentPostId:()=>r.default,useCurrentTheme:()=>s.default,useDebounce:()=>o.default,useHasInnerBlocks:()=>i.default,useInnerBlocks:()=>a.default,useInnerBlocksAttributes:()=>l.default,useInnerBlocksCount:()=>c.default,useInnerBlocksIndex:()=>u.default,useMedia:()=>d.default,useOption:()=>p.default,useParentBlock:()=>f.default,useParentBlockAttributes:()=>h.default,usePost:()=>m.default,usePostById:()=>g.default,usePostMeta:()=>y.default,usePostMetaValue:()=>v.default,usePosts:()=>A.default,usePreviewLink:()=>b.default,useTerm:()=>_.default,useTerms:()=>C.default});var r=n(9695),s=n(5904),o=n(7112),i=n(6980),a=n(864),l=n(8512),c=n(1344),u=n(6644),d=n(592),p=n(7188),f=n(224),h=n(8004),m=n(1744),g=n(9480),y=n(6504),v=n(3772),A=n(4704),b=n(7532),_=n(7712),C=n(1848)},9695:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>{const t=e("core/editor");return t?t.getCurrentPostId():null}),[])},5904:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>{const t=e("core");return t?t.getCurrentTheme()?.stylesheet:null}),[])},7112:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(1280);const s=(e,t)=>{const[n,s]=(0,r.useState)(e);return(0,r.useEffect)((()=>{const n=setTimeout((()=>{s(e)}),t);return()=>{clearTimeout(n)}}),[e,t]),n}},6980:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocksCount)(e)>0},6644:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>{const t=(0,r.useParentBlock)(e),n=(0,r.useInnerBlocks)(t);return n?n.findIndex((t=>t.clientId===e)):-1}},8512:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocks)(e).map((e=>e.attributes))},1344:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=e=>(0,r.useInnerBlocks)(e).length},864:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>t(r.store).getBlocks(e)),[e])},592:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=e=>(0,r.useSelect)((t=>t("core").getMedia(e)),[e])},7188:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=function(e){const t=(0,r.useSelect)((t=>{const{getEditedEntityRecord:n,getEntityRecordEdits:r,isSavingEntityRecord:s}=t("core"),o=n("root","site"),i=r("root","site");return{value:o?.[e],isEdited:!!i?.[e],isSaving:s("root","site")}}),[]),{editEntityRecord:n,saveEntityRecord:s}=(0,r.useDispatch)("core");return{...t,onChange:function(t){n("root","site",void 0,{[e]:t})},onSave:async function(){await s("root","site",{[e]:t.value})}}}},8004:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>{const{getBlockAttributes:n,getBlockRootClientId:s}=t(r.store),o=s(e);return o?n(o):null}),[e])},224:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(9528),s=n(7752);const o=e=>(0,s.useSelect)((t=>{const{getBlock:n,getBlockRootClientId:s}=t(r.store),o=s(e);return o?n(o):null}),[e])},9480:(e,t,n)=>{"use strict";n.d(t,{default:()=>l});var r=n(1280),s=n(4632),o=n.n(s),i=n(7204),a=n(1744);const l=(e,t=null,n={context:"view"})=>{const[s,l]=(0,r.useState)({}),[c,u]=(0,r.useState)(!0);(0,r.useEffect)((()=>{u(!0),e&&!s[e]?(async()=>{if(t){const n=await t(e);n?l((t=>({...t,[e]:n}))):console.error(`Custom function to get post with ID ${e} failed.`)}else{const t=(0,i.addQueryArgs)("/wp/v2/search",{include:e}),n=await o()({path:t});n.length>0&&l((t=>({...t,[e]:n[0]?.subtype})))}u(!1)})():e&&s[e]&&u(!1)}),[e]);const d=(0,a.default)(e,s[e]??"",n);return c||!d&&s[e]?null:d}},3772:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(2e3);const s=(e,t=null,n=null)=>{const[s,o]=(0,r.usePostMeta)(t,n);return[s[e],t=>o({...s,[e]:t})]}},6504:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(3048),s=n(7752);const o=(e=null,t=null)=>{const n=(0,s.useSelect)((t=>e||t("core/editor").getCurrentPostType()),[]),[o,i]=(0,r.useEntityProp)("postType",n,"meta",t),a="function"==typeof i?i:()=>console.error(`Error attempting to set post meta for post type ${n}. Does it have support for custom-fields?`);return["object"==typeof o?o:{},e=>a({...e})]}},1744:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="post",n={context:"view"})=>(0,r.useSelect)((r=>r("core").getEntityRecord("postType",t,e,n)),[e,t])},4704:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="post")=>(0,r.useSelect)((n=>{const{getEntityRecords:r}=n("core");return r("postType",t,{include:e})}),[e,t])},7532:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=()=>(0,r.useSelect)((e=>e("core").getEditedPostPreviewLink()),[])},7712:(e,t,n)=>{"use strict";n.d(t,{default:()=>s});var r=n(7752);const s=(e,t="category",n={context:"view"})=>(0,r.useSelect)((r=>r("core").getEntityRecord("taxonomy",t,e,n)),[e,t])},1848:(e,t,n)=>{"use strict";n.d(t,{default:()=>o});var r=n(3048),s=n(7752);const o=(e=null,t=null,n="categories")=>{const o=(0,s.useSelect)((t=>e||t("core/editor").getCurrentPostType()),[]),[i,a]=(0,r.useEntityProp)("postType",o,n,t);return[i,e=>a(e)]}},5328:(e,t,n)=>{"use strict";n.d(t,{getMediaUrl:()=>i.c,parseCSVFile:()=>o});var r=n(2232),s=n.n(r);const o=e=>new Promise(((t,n)=>{s().parse(e,{complete:e=>t(e.data),dynamicTyping:!0,error:e=>n(e),header:!0,skipEmptyLines:!0})}));var i=n(6199)},6199:(e,t,n)=>{"use strict";n.d(t,{c:()=>r});const r=(e,t="full")=>{const{media_details:{sizes:{[t]:{source_url:n=""}={},full:{source_url:r=""}={}}={}}={},sizes:{[t]:{url:s=""}={},full:{url:o=""}={}}={},source_url:i="",url:a=""}=e;return s||n||o||r||a||i||""}},1280:e=>{"use strict";e.exports=window.React},4632:e=>{"use strict";e.exports=window.wp.apiFetch},9528:e=>{"use strict";e.exports=window.wp.blockEditor},7287:e=>{"use strict";e.exports=window.wp.components},3048:e=>{"use strict";e.exports=window.wp.coreData},7752:e=>{"use strict";e.exports=window.wp.data},3396:e=>{"use strict";e.exports=window.wp.i18n},7204:e=>{"use strict";e.exports=window.wp.url}},t={};function n(r){var s=t[r];if(void 0!==s)return s.exports;var o=t[r]={id:r,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var r={};return(()=>{"use strict";n.r(r),n.d(r,{AudioPicker:()=>e.AudioPicker,CSVUploader:()=>e.CSVUploader,Checkboxes:()=>e.Checkboxes,ImagePicker:()=>e.ImagePicker,MediaPicker:()=>e.MediaPicker,PostPicker:()=>e.PostPicker,PostSelector:()=>e.PostSelector,SafeHtml:()=>e.SafeHtml,Selector:()=>e.Selector,Sortable:()=>e.Sortable,SortableItem:()=>e.SortableItem,TermSelector:()=>e.TermSelector,VideoPicker:()=>e.VideoPicker,getMediaUrl:()=>s.getMediaUrl,parseCSVFile:()=>s.parseCSVFile,useCurrentPostId:()=>t.useCurrentPostId,useCurrentTheme:()=>t.useCurrentTheme,useDebounce:()=>t.useDebounce,useHasInnerBlocks:()=>t.useHasInnerBlocks,useInnerBlocks:()=>t.useInnerBlocks,useInnerBlocksAttributes:()=>t.useInnerBlocksAttributes,useInnerBlocksCount:()=>t.useInnerBlocksCount,useInnerBlocksIndex:()=>t.useInnerBlocksIndex,useMedia:()=>t.useMedia,useOption:()=>t.useOption,useParentBlock:()=>t.useParentBlock,useParentBlockAttributes:()=>t.useParentBlockAttributes,usePost:()=>t.usePost,usePostById:()=>t.usePostById,usePostMeta:()=>t.usePostMeta,usePostMetaValue:()=>t.usePostMetaValue,usePosts:()=>t.usePosts,usePreviewLink:()=>t.usePreviewLink,useTerm:()=>t.useTerm,useTerms:()=>t.useTerms});var e=n(7720),t=n(2e3),s=n(5328)})(),r})(),e.exports=t()},251:function(e,t,n){"use strict";var r=n(196),s=Symbol.for("react.element"),o=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),i=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var r,l={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)o.call(t,r)&&!a.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===l[r]&&(l[r]=t[r]);return{$$typeof:s,type:e,key:c,ref:u,props:l,_owner:i.current}}t.jsx=l,t.jsxs=l},893:function(e,t,n){"use strict";e.exports=n(251)},196:function(e){"use strict";e.exports=window.React}},t={};function n(r){var s=t[r];if(void 0!==s)return s.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}!function(){"use strict";var e=window.wp.plugins,t=n(196),r=window.wp.components,s=window.wp.editPost,o=window.wp.i18n,i=n(373),a=window.wp.data;function l(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;for(const r of e)r.name===t&&(n+=1),r.innerBlocks&&r.innerBlocks.length>0&&(n=l(r.innerBlocks,t,n));return n}var c=n(893);(0,e.registerPlugin)("wp-curate-deduplication",{icon:"",render:function(){const[e,n]=(0,i.usePostMetaValue)("wp_curate_deduplication"),[u,d]=(0,i.usePostMetaValue)("wp_curate_unique_pinned_posts"),p=l((0,a.useSelect)((e=>e("core/block-editor").getBlocks()),[]),"wp-curate/query")>=2;return(0,t.useEffect)((()=>{p&&!e&&u&&d(!1)}),[e,d,p,u]),p?(0,c.jsxs)(s.PluginDocumentSettingPanel,{icon:"",name:"deduplication",title:(0,o.__)("Deduplication","wp-curate"),children:[(0,c.jsx)(r.ToggleControl,{label:(0,o.__)("Enable deduplication","wp-curate"),checked:e,onChange:e=>n(e)}),(0,c.jsx)(r.ToggleControl,{disabled:!e,label:(0,o.__)("Enable unique pinned posts","wp-curate"),checked:u,onChange:d})]}):null}})}()}(); \ No newline at end of file diff --git a/build/slotfills/index.php b/build/slotfills/index.php new file mode 100644 index 00000000..e7917f36 --- /dev/null +++ b/build/slotfills/index.php @@ -0,0 +1,53 @@ +should_register_block() ) { + return; + } + + // Automatically load dependencies and version. + $asset_file = include __DIR__ . '/index.asset.php'; + + wp_register_script( + 'wp-curate_slotfills', + plugins_url( 'index.js', __FILE__ ), + $asset_file['dependencies'], + $asset_file['version'], + true + ); + + wp_set_script_translations( 'wp-curate_slotfills', 'wp-curate' ); +} +add_action( 'init', __NAMESPACE__ . '\register_slotfills_scripts' ); + +/** + * Enqueue block editor assets for this slotfill. + */ +function action_enqueue_slotfills_assets(): void { + wp_enqueue_script( 'wp-curate_slotfills' ); +} +add_action( + 'enqueue_block_editor_assets', + __NAMESPACE__ . '\action_enqueue_slotfills_assets' +); diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index df74cc5c..00000000 --- a/phpunit.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - tests/feature - - - tests/unit - - - diff --git a/tests/bootstrap.php b/tests/bootstrap.php deleted file mode 100644 index e22936b9..00000000 --- a/tests/bootstrap.php +++ /dev/null @@ -1,16 +0,0 @@ -maybe_rsync_plugin() - ->with_sqlite() - // Load the main file of the plugin. - ->loaded( fn () => require_once __DIR__ . '/../wp-curate.php' ) - ->install(); diff --git a/tests/class-test-case.php b/tests/class-test-case.php deleted file mode 100644 index f37440ef..00000000 --- a/tests/class-test-case.php +++ /dev/null @@ -1,18 +0,0 @@ -set_permalink_structure( '/%postname%/' ); - - static::factory()->post->create( - [ - 'post_title' => 'Test Post 1', - ] - ); - static::factory()->post->create( - [ - 'post_title' => 'Test Post 2', - ] - ); - static::factory()->post->create( - [ - 'post_title' => 'Test Post 3', - ] - ); - static::factory()->post->create( - [ - 'post_title' => 'Test Post 4', - ] - ); - static::factory()->post->create( - [ - 'post_title' => 'Test Post 5', - ] - ); - static::factory()->post->create( - [ - 'post_title' => 'Test Post 6', - ] - ); - } - - /** - * Create the HTML content for the test. - * - * @param int $pinned_post_id The pinned post id. - * @return string - */ - private function create_html_content( int $pinned_post_id ): string { - return << -
- -
- -
- - - -
- -
- -
- - - -
- -
- -
- - HTML; - } - - /** - * Do not enforce unique pinned posts if it is not enabled. - */ - public function test_do_not_enforce_unique_pinned_posts_if_not_enabled() { - $pinned_post = static::factory()->post->as_models()->create_and_get( - [ - 'post_title' => 'Pinned Post 1', - ] - ); - $pinned_post_id = $pinned_post->id(); - - $content = $this->create_html_content( $pinned_post_id ); - - $test_post = static::factory() - ->post - ->with_meta( - [ - 'wp_curate_deduplication' => '1', - 'wp_curate_unique_pinned_posts' => '0', - ] - ) - ->create_and_get( [ 'post_content' => $content ] ); - - $page = $this->get( $test_post )->assertOk(); - - $this->assertEquals( 2, substr_count( $page->get_content(), 'Pinned Post 1' ) ); - } - - /** - * If configured, pinned posts should only display once regardless of where on the page - * the post was pinned at. - */ - public function test_pinned_post_only_displays_once() { - $pinned_post = static::factory()->post->as_models()->create_and_get( - [ - 'post_title' => 'Pinned Post 2', - ] - ); - $pinned_post_id = $pinned_post->id(); - - $content = $this->create_html_content( $pinned_post_id ); - - $test_post = static::factory() - ->post - ->with_meta( - [ - 'wp_curate_deduplication' => '1', - 'wp_curate_unique_pinned_posts' => '1', - ] - ) - ->create_and_get( [ 'post_content' => $content ] ); - - $page = $this->get( $test_post )->assertOk(); - - $this->assertEquals( 1, substr_count( $page->get_content(), 'Pinned Post 2' ) ); - } -} diff --git a/tests/unit/ExampleUnitTest.php b/tests/unit/ExampleUnitTest.php deleted file mode 100644 index e9c1bc97..00000000 --- a/tests/unit/ExampleUnitTest.php +++ /dev/null @@ -1,24 +0,0 @@ -assertTrue( true ); - } -} diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/CHANGELOG.md b/vendor/alleyinteractive/composer-wordpress-autoloader/CHANGELOG.md new file mode 100644 index 00000000..1bd5d96c --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/CHANGELOG.md @@ -0,0 +1,62 @@ +# Changelog + +All notable changes to `alleyinteractive/composer-wordpress-autoloader` will be +documented in this file. + +## Unreleased + +## v1.1.0 + +### Changed + +- Dropped PHP 7.4 support, adding PHP 8.2 and 8.3 support explicitly with testing. +- Added testing against Windows. + +### Fixed + +- Fixed issue with `wordpress-autoload.php` file not properly loading on Windows. + +## v1.0.0 + +No changes, tagging a stable release. + +## v0.8.0 + +- Automatically translate the `vendor-dir` and set the autoloaded files relative to the root directory of the project. + +## v0.7.0 + +- Add APCu autoloader. +- Bump `alleyinteractive/wordpress-autoloader` to `v1.1.0`. + +## v0.6.0 + +- Simplify injection of autoloader. +- Automatically load the autoloader inside of `vendor/autoload.php` without the + need to load `vendor/wordpress-autoload.php` manually. + +## v0.4.1 + +### Updated + +* Fix Composer Injection to `vendor/autoload.php` in https://github.com/alleyinteractive/composer-wordpress-autoloader/pull/10 + +## v0.4.0 + +### Added + +- Bump alleyinteractive/wordpress-autoloader to 0.2 by @srtfisher in https://github.com/alleyinteractive/composer-wordpress-autoloader/pull/7 +- Supports PHP 8.1 + +## 0.3.0 + +- Remove specific Composer version dependency. + +## 0.2.0 + +- Updates autoloader to use non-hard-coded paths. +- Adds support for dependencies to autoload files as well, fixes [#3](https://github.com/alleyinteractive/composer-wordpress-autoloader/issues/3). + +## 0.1.0 + +- Initial release. diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/README.md b/vendor/alleyinteractive/composer-wordpress-autoloader/README.md new file mode 100644 index 00000000..ee4d45ea --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/README.md @@ -0,0 +1,94 @@ +# Composer WordPress Autoloader + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/alleyinteractive/composer-wordpress-autoloader.svg?style=flat-square)](https://packagist.org/packages/alleyinteractive/composer-wordpress-autoloader) +[![Tests](https://github.com/alleyinteractive/composer-wordpress-autoloader/actions/workflows/tests.yml/badge.svg)](https://github.com/alleyinteractive/composer-wordpress-autoloader/actions/workflows/tests.yml) + +Autoload WordPress files configured via Composer that support the [Wordpress +Coding +Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/) +using +[alleyinteractive/wordpress-autoloader](https://github.com/alleyinteractive/wordpress-autoloader). +Will load the autoloaded classes defined in your package and all autoloaded +classes in your dependencies. + +## Installation + +You can install the package via composer: + +```bash +composer require alleyinteractive/composer-wordpress-autoloader +``` + +## Usage + +```json +{ + "autoload": { + "wordpress": { + "My_Plugin_Namespace\\": "src/", + } + }, + "autoload-dev": { + "wordpress": { + "My_Plugin_Namespace\\Tests\\": "tests/", + } + } +} +``` + +Once added, you can load `vendor/autoload.php` as normal and the autoloader will +handle the rest. If that doesn't work, see [Automatically Injecting WordPress +Autoloader](#automatically-injecting-wordpress-autoloader). + +### Use Inside Packages Published to Packagist + +Packages published to Packagist are required to be valid and have a +`composer.json` that passed a `composer validate`. Composer does not consider +`wordpress` to be a valid value inside of the `autoload` or `autoload-dev` +property. To allow packages to register autoloading in a valid format, you can +use the following format: + +```json +{ + "extra": { + "wordpress-autoloader": { + "autoload": { + "My_Plugin_Namespace\\": "src/", + }, + "autoload-dev": { + "My_Plugin_Namespace\\Tests\\": "tests/", + } + } + } +} +``` + +### Automatically Injecting WordPress Autoloader + +By default Composer WordPress Autoloader will automatically load the WordPress +autoloader. This is done by adding `src/autoload.php` as an autoloaded file to +Composer. However, this may not always work under some circumstances including +symlinks. When necessary, you can opt to inject the +`vendor/wordpress-autoload.php` file into your `vendor/autoload.php` file. This +is disabled by default and be enabled by setting `inject` to `true` in your +`composer.json`. + +```json +{ + "extra": { + "wordpress-autoloader": { + "inject": true + } + } +} +``` + +## Testing + +```bash +composer test +``` + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/composer.json b/vendor/alleyinteractive/composer-wordpress-autoloader/composer.json new file mode 100644 index 00000000..779de3d5 --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/composer.json @@ -0,0 +1,55 @@ +{ + "name": "alleyinteractive/composer-wordpress-autoloader", + "type": "composer-plugin", + "description": "Autoload files using WordPress File Conventions using Composer", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Alley Interactive", + "email": "info@alley.co" + }, + { + "name": "Sean Fisher", + "email": "sean@alley.co" + } + ], + "require": { + "php": "^8.0", + "alleyinteractive/wordpress-autoloader": "^1.1.1", + "composer-plugin-api": "^2.0" + }, + "require-dev": { + "composer/composer": "*", + "phpunit/phpunit": "^9.5.8", + "squizlabs/php_codesniffer": "^4.0" + }, + "extra": { + "class": "ComposerWordPressAutoloader\\Plugin" + }, + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "ComposerWordPressAutoloader\\": "src/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": { + "lint": "@phpcs", + "lint:fix": "@phpcbf", + "phpcbf": "phpcbf --standard=./phpcs.xml.dist .", + "phpcs": "phpcs --standard=./phpcs.xml.dist .", + "phpunit": "phpunit", + "test": [ + "@phpcs", + "@phpunit" + ] + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/phpcs.xml.dist b/vendor/alleyinteractive/composer-wordpress-autoloader/phpcs.xml.dist new file mode 100644 index 00000000..616aa35a --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/phpcs.xml.dist @@ -0,0 +1,21 @@ + + + Coding standards for Composer WordPress Autoload Plugin + + + + + + + + . + */.github/* + */vendor/* + tests/fixtures/* + + + + + + diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/src/AutoloadFactory.php b/vendor/alleyinteractive/composer-wordpress-autoloader/src/AutoloadFactory.php new file mode 100644 index 00000000..6d741dd0 --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/src/AutoloadFactory.php @@ -0,0 +1,61 @@ +> $rules Array of rules. + * @return array + */ + public static function generateFromRules(array $rules) + { + $loaders = []; + + foreach ($rules as $namespace => $paths) { + $loaders = array_merge( + $loaders, + array_map(function ($path) use ($namespace) { + $loader = new Autoloader($namespace, $path); + + if (static::$apcuPrefix) { + $loader->set_apcu_prefix(static::$apcuPrefix); + } + + return $loader; + }, $paths), + ); + } + + return $loaders; + } + + /** + * Register autoloaders from rules. + * + * @param array $rules Array of rules. + * @return void + */ + public static function registerFromRules(array $rules) + { + foreach (static::generateFromRules($rules) as $autoloader) { + $autoloader->register(); + } + } +} diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/src/AutoloadGenerator.php b/vendor/alleyinteractive/composer-wordpress-autoloader/src/AutoloadGenerator.php new file mode 100644 index 00000000..e6d8c279 --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/src/AutoloadGenerator.php @@ -0,0 +1,327 @@ +getEventDispatcher(), $io); + + $this->composer = $composer; + } + + /** + * @param bool $devMode + * @return void + */ + public function setDevMode($devMode = true) + { + parent::setDevMode($devMode); + + $this->devMode = (bool) $devMode; + } + + /** + * Whether generated autoloader considers APCu caching. + * + * @param bool $apcu + * @param string|null $apcuPrefix + * @return void + */ + public function setApcuMode(bool $apcu, ?string $apcuPrefix = null) + { + parent::setApcu($apcu, $apcuPrefix); + + $this->apcu = $apcu; + $this->apcuPrefix = $apcuPrefix !== null ? $apcuPrefix : $apcuPrefix; + } + + /** + * Generate the autoload file. + * + * @param boolean $beingInjected Flag if the autoload file is being injected. + * @param boolean $isDevMode Flag if dev dependencies are being included. + * @return string + */ + public function generate(bool $beingInjected, bool $isDevMode = true): string + { + $filesystem = new Filesystem(); + $basePath = $filesystem->normalizePath(realpath(realpath(getcwd()))); + $vendorPath = $filesystem->normalizePath(realpath(realpath($this->composer->getConfig()->get('vendor-dir')))); + + $vendorPathCode = '__DIR__'; + + $appBaseDirCode = $filesystem->findShortestPathCode($vendorPath, $basePath, true); + $appBaseDirCode = str_replace('__DIR__', '$vendorDir', $appBaseDirCode); + + $this->setDevMode($isDevMode); + + // Collect all the rules from all the packages. + $rules = array_merge_recursive( + $this->collectAutoloaderRules(), + $this->collectExtraAutoloaderRules(), + ); + + foreach ($rules as $namespace => $paths) { + // Convert the paths to be relative to the vendor/wordpress-autoload.php file. + $rules[$namespace] = array_values(array_unique( + array_map(fn ($path) => $this->getPathCode($filesystem, $basePath, $vendorPath, $path), $paths), + )); + } + + return $this->getAutoloadFileContents($rules, $beingInjected, $vendorPathCode, $appBaseDirCode); + } + + /** + * Create the autoloader file contents to write to vendor/wordpress-autoload.php. + * + * @param array $rules The rules to use to generate the autoloader. + * @param boolean $beingInjected Flag if the autoload file is being injected. + * @param string $vendorPathCode Vendor path code. + * @param string $appBaseDirCode App base dir code. + * @return string + */ + protected function getAutoloadFileContents( + array $rules, + bool $beingInjected, + string $vendorPathCode, + string $appBaseDirCode + ): string { + $autoloadFileContents = <<apcu) { + $apcuPrefix = var_export( + $this->apcuPrefix !== null + ? $this->apcuPrefix + : substr(base64_encode(md5(uniqid('', true), true)), 0, -3), + true, + ); + $autoloadFileContents .= "\n\\ComposerWordPressAutoloader\AutoloadFactory::setApcuPrefix($apcuPrefix);\n"; + } + + // Inject the file paths for the autoloader. + $autoloadFileContents .= << $paths) { + $autoloadFileContents .= sprintf( + ' %s => array(%s),', + var_export($namespace, true), + implode(', ', $paths), + ) . PHP_EOL; + } + + $autoloadFileContents .= "));\n"; + + if (!$beingInjected) { + $autoloadFileContents .= "\nreturn \$autoload;"; + } + + return $autoloadFileContents . "\n"; + } + + /** + * Collect the autoloader rules from 'autoload' and 'autoload-dev' to + * generate rules for. + * + * @return array + */ + protected function collectAutoloaderRules(): array + { + return $this->parseAutoloads( + $this->buildPackageMap( + $this->composer->getInstallationManager(), + $this->composer->getPackage(), + $this->composer->getRepositoryManager()->getLocalRepository()->getCanonicalPackages(), + ), + $this->composer->getPackage(), + !$this->devMode, + )['wordpress'] ?? []; + } + + /** + * Collect the autoloader rules registered via 'extra' to generate for. + * + * @return array + */ + protected function collectExtraAutoloaderRules(): array + { + return $this->parseExtraAutoloads( + $this->buildPackageMap( + $this->composer->getInstallationManager(), + $this->composer->getPackage(), + $this->composer->getRepositoryManager()->getLocalRepository()->getCanonicalPackages(), + ), + $this->composer->getPackage(), + !$this->devMode, + )['wordpress'] ?? []; + } + + /** + * Compiles an ordered list of namespace => path mappings + * + * @param array $packageMap + * @param PackageInterface $rootPackage + * @param boolean $filteredDevPackages + * @return array> + */ + public function parseAutoloads(array $packageMap, PackageInterface $rootPackage, $filteredDevPackages = false) + { + $rootPackageMap = array_shift($packageMap); + + // Mirroring existing logic in the Composer AutoloadGenerator. + if (is_array($filteredDevPackages)) { + $packageMap = array_filter($packageMap, function ($item) use ($filteredDevPackages) { + return !in_array($item[0]->getName(), $filteredDevPackages, true); + }); + } elseif ($filteredDevPackages) { + $packageMap = $this->filterPackageMap($packageMap, $rootPackage); + } + + if ($filteredDevPackages) { + $packageMap = $this->filterPackageMap($packageMap, $rootPackage); + } + + $sortedPackageMap = $this->sortPackageMap($packageMap); + $sortedPackageMap[] = $rootPackageMap; + array_unshift($packageMap, $rootPackageMap); + + $wordpress = $this->parseAutoloadsType($sortedPackageMap, 'wordpress', $rootPackage); + + krsort($wordpress); + + return [ + 'wordpress' => $wordpress, + ]; + } + + /** + * Compiles an ordered list of namespace => path mappings of autoloads defined in the 'extra' part of a package. + * + * @param array $packageMap + * @param PackageInterface $rootPackage + * @param boolean $filteredDevPackages + * @return array + */ + public function parseExtraAutoloads(array $packageMap, PackageInterface $rootPackage, $filteredDevPackages = false) + { + $rootPackageMap = array_shift($packageMap); + + // Mirroring existing logic in the Composer AutoloadGenerator. + if (is_array($filteredDevPackages)) { + $packageMap = array_filter($packageMap, function ($item) use ($filteredDevPackages) { + return !in_array($item[0]->getName(), $filteredDevPackages, true); + }); + } elseif ($filteredDevPackages) { + $packageMap = $this->filterPackageMap($packageMap, $rootPackage); + } + + if ($filteredDevPackages) { + $packageMap = $this->filterPackageMap($packageMap, $rootPackage); + } + + $sortedPackageMap = $this->sortPackageMap($packageMap); + $sortedPackageMap[] = $rootPackageMap; + array_unshift($packageMap, $rootPackageMap); + + return [ + 'wordpress' => $this->parseExtraAutoloadsType($sortedPackageMap, 'wordpress', $rootPackage), + ]; + } + + /** + * A modified port of the {@see AutoloadGenerator::parseAutoloadsType()} method from Composer. + * + * Imports autoload rules from a package's extra path. + * + * @param array $packageMap + * @param string $type one of: 'wordpress' + * @return array|array>|array + */ + protected function parseExtraAutoloadsType(array $packageMap, $type, RootPackageInterface $rootPackage) + { + $autoloads = []; + + foreach ($packageMap as $item) { + [$package, $installPath] = $item; + $autoload = [ + 'wordpress' => $package->getExtra()['wordpress-autoloader']['autoload'] ?? [], + ]; + + // Include autoload dev if we're in dev mode and this is the root package. + // Non-root package dev dependencies are not loaded. + if ($this->devMode && $package === $rootPackage) { + $autoload = array_merge_recursive( + $autoload, + [ + 'wordpress' => $package->getExtra()['wordpress-autoloader']['autoload-dev'] ?? [], + ], + ); + } + + // Skip misconfigured packages. + if (!isset($autoload[$type]) || !is_array($autoload[$type])) { + continue; + } + + if (null !== $package->getTargetDir() && $package !== $rootPackage) { + $installPath = substr($installPath, 0, -strlen('/' . $package->getTargetDir())); + } + + if ($package !== $rootPackage && $rootPackage->getTargetDir()) { + $installPath = str_replace($rootPackage->getTargetDir(), '', $installPath); + } + + foreach ($autoload[$type] as $namespace => $paths) { + foreach ((array) $paths as $path) { + $relativePath = empty($installPath) ? (empty($path) ? '.' : $path) : $installPath . '/' . $path; + $autoloads[$namespace][] = $relativePath; + } + } + } + + return $autoloads; + } +} diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/src/Plugin.php b/vendor/alleyinteractive/composer-wordpress-autoloader/src/Plugin.php new file mode 100644 index 00000000..90c9c021 --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/src/Plugin.php @@ -0,0 +1,209 @@ +composer = $composer; + $this->io = $io; + $this->filesystem = new Filesystem(); + } + + /** + * Remove any hooks from Composer + * + * This will be called when a plugin is deactivated before being + * uninstalled, but also before it gets upgraded to a new version + * so the old one can be deactivated and the new one activated. + * + * @param Composer $composer + * @param IOInterface $io + * + * @return void + */ + public function deactivate(Composer $composer, IOInterface $io) + { + } + + /** + * Prepare the plugin to be uninstalled + * + * This will be called after deactivate. + * + * @param Composer $composer + * @param IOInterface $io + * + * @return void + */ + public function uninstall(Composer $composer, IOInterface $io) + { + if ($this->filesystem->remove($this->getAutoloaderFilePath())) { + $this->io->write('Removed WordPress autoloader.'); + } + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * @return array + */ + public static function getSubscribedEvents() + { + return [ + 'post-autoload-dump' => 'generateAutoloaderFile', + ]; + } + + /** + * Generate the autoloader file. + * + * @param Event $event + * @return void + */ + public function generateAutoloaderFile(Event $event): void + { + $this->filesystem->ensureDirectoryExists($this->composer->getConfig()->get('vendor-dir')); + + $this->generator = new AutoloadGenerator( + $this->composer, + $this->io, + ); + + $this->generator->setApcuMode( + $this->composer->getConfig()->get('apcu-autoloader') + ); + + // Merge default configuration with the one provided in the composer.json file. + $extra = array_merge( + [ + 'inject' => false, + ], + $this->composer->getPackage()->getExtra()['wordpress-autoloader'] ?? [], + ); + + /** + * Determine if we should inject our autoloader into the + * vendor/autoload.php from Composer. + * + * Injecting is not generally necessary any more since the file will + * automatically be loaded. However, it is still possible to inject it + * for circumstances where it is needed such as when dealing with symlinks. + */ + $injecting = $extra['inject'] ?? false; + + $autoloaderFile = $this->generator->generate($injecting, $event->isDevMode()); + + $partyEmoji = [ + '🪩', + '🎉', + '🎊', + '🍾', + ]; + + $partyEmoji = $partyEmoji[array_rand($partyEmoji)]; + + if ( + $this->filesystem->filePutContentsIfModified( + $this->getAutoloaderFilePath(), + $autoloaderFile, + ) + ) { + if (!$injecting) { + $this->io->write("{$partyEmoji} WordPress autoloader generated"); + } + } + + // Inject the autoloader into the existing autoloader. + if ($injecting) { + if ( + $this->filesystem->filePutContentsIfModified( + $this->composer->getConfig()->get('vendor-dir') . '/autoload.php', + $this->getInjectedAutoloaderFileContents($this->getAutoloaderFilePath()), + ) + ) { + $this->io->write( + "{$partyEmoji} WordPress autoloader genearted and injected into vendor/autoload.php." + ); + } else { + $this->io->write('⚠️ Error injecting Wordpress Autoloader.'); + } + } + } + + /** + * Retrieve the file path for the autoloader file. + * + * @return string + */ + protected function getAutoloaderFilePath(): string + { + $vendorDir = $this->composer->getConfig()->get('vendor-dir'); + return "{$vendorDir}/wordpress-autoload.php"; + } + + /** + * Generate the injected autoloader file. + * + * @param string $autoloaderFileName The path to the WordPress autoloader file. + * @return string + */ + protected function getInjectedAutoloaderFileContents(string $autoloaderFileName): string + { + $filename = basename($autoloaderFileName); + $autoloader = file_get_contents($this->composer->getConfig()->get('vendor-dir') . '/autoload.php'); + + $contents = preg_replace_callback( + '/^return (.*);$/m', + function ($matches) use ($filename) { + $autoloader = << wordpress-autoloader' + section of your composer.json file to false. Injecting the autoloader is + not generally necessary as the autoloader is automatically loaded for you. +*/ +require_once __DIR__ . '/{$filename}'; + +return \$loader; +AUTOLOADER; + + return "$autoloader\n"; + }, + $autoloader, + 1, + $count, + ); + + if (!$count) { + throw new RuntimeException('Error finding proper place to inject autoloader.'); + } + + return $contents; + } +} diff --git a/vendor/alleyinteractive/composer-wordpress-autoloader/src/autoload.php b/vendor/alleyinteractive/composer-wordpress-autoloader/src/autoload.php new file mode 100644 index 00000000..64922229 --- /dev/null +++ b/vendor/alleyinteractive/composer-wordpress-autoloader/src/autoload.php @@ -0,0 +1,30 @@ + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/alleyinteractive/laminas-validator-extensions/README.md b/vendor/alleyinteractive/laminas-validator-extensions/README.md new file mode 100644 index 00000000..9084c84b --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/README.md @@ -0,0 +1,377 @@ +# Laminas Validator Extensions + +This package provides additional validation classes for [the Laminas Validator framework](https://docs.laminas.dev/laminas-validator/), plus a custom base validation class. + +## Installation + +Install the latest version with: + +```bash +$ composer require alleyinteractive/laminas-validator-extensions +``` + +## Basic usage + +For more information about what validators do, how to use them, and how to write your own, [visit the Laminas documentation](https://docs.laminas.dev/laminas-validator/). + +## Base validators + +### `ExtendedAbstractValidator` + +The abstract `Alley\Validator\ExtendedAbstractValidator` class standardizes the implementation of custom validators with `\Laminas\Validator\AbstractValidator`. + +When extending `ExtendedAbstractValidator`, validation logic goes into a new `testValue()` method, which is responsible only for applying the logic and adding any validation errors. It's no longer necessary to call `setValue()` prior to evaluating the input, and `isValid()` will return `true` if there are no error messages after evaluating the input and `false` if there are any messages. + +Before: + +```php + "'%value%' is not a floating point value", + ]; + + public function isValid($value) + { + $this->setValue($value); + + if (! is_float($value)) { + $this->error(self::FLOAT); + return false; + } + + return true; + } +} +``` + +After: + +```php + "'%value%' is not a floating point value", + ]; + + public function testValue($value): void + { + if (! is_float($value)) { + $this->error(self::FLOAT); + } + } +} +``` + +### `FreeformValidator` + +The standalone, abstract `Alley\Validator\FreeformValidator` class leaves most of the implementation details to your discretion, but it's often easier to use for validators that are project-specific or not ready for wider distribution. + +Like the `ExtendedAbstractValidator` class, the `FreeformValidator` expects that validation logic goes into a `testValue()` method, and `isValid()` will return `true` or `false` based on whether there are error messages. + +Validation errors can be added using the `error()` method, which accepts the message key and text. + +```php +error('float', 'Please enter a floating point value'); + } + } +} +``` + +## "Any Validator" chains + +`\Alley\Validator\AnyValidator` is like a [Laminas validator chain](https://docs.laminas.dev/laminas-validator/validator-chains/) except that it connects the validators with "OR," marking input as valid as soon it passes one of the given validators. + +Unlike a Laminas validator chain, validators can only be attached, not prepended, and there is no `$priority` argument. + +### Basic usage + +```php + 10])]); +$valid->attach(new \Laminas\Validator\GreaterThan(['min' => 90])); + +$valid->isValid(9); // true +$valid->isValid(99); // true +$valid->isValid(42); // false +``` + +## "Fast fail" validator chains + +`\Alley\Validator\FastFailValidatorChain` is like a [Laminas validator chain](https://docs.laminas.dev/laminas-validator/validator-chains/) except that if a validator fails, the chain will automatically be broken; there is no `$breakChainOnFailure` parameter. + +Unlike a Laminas validator chain, validators can only be attached, not prepended, and there is no `$priority` argument. + +### Basic usage + +```php +$valid = new \Alley\Validator\FastFailValidatorChain([new \Laminas\Validator\LessThan(['max' => 10])]); +$valid->attach(new \Laminas\Validator\GreaterThan(['min' => 90])); + +$valid->isValid(42); // false +count($valid->getMessages()); // 1 +``` + +## Validators by operator name + +`\Alley\Validator\ValidatorByOperator` allows you to access a validator using a readable operator name, such as `REGEX` or `NOT IN`. + +Its primary use case is to allow you to write functions that accept the readable operator names as parameters while using validators internally. Here's a demonstrative function call from [the wp-match-blocks library](https://github.com/alleyinteractive/wp-match-blocks): + +```php + 'core/image', + 'attrs' => [ + [ + 'key' => 'credit', + 'value' => '/(The )?Associated Press/i', + 'operator' => 'REGEX', + ], + ], + ], +); +``` + +The supported operator names are: + +* `CONTAINS` and `NOT CONTAINS`, which forward to `\Alley\Validator\ContainsString` using a case-sensitive search. +* `IN` and `NOT IN`, which forward to `\Alley\Validator\OneOf`. +* `LIKE` and `NOT LIKE`, which forward to `\Alley\Validator\ContainsString` using a case-insensitive search. +* `REGEX` and `NOT REGEX`, which forward to `\Laminas\Validator\Regex`. +* `===`, `!==`, and the other operators supported by `\Alley\Validator\Comparison`. + +Any operator name that isn't forwarded to a different validator must be a valid `Comparison` operator. + +### Basic usage + +```php +$valid = new \Alley\Validator\ValidatorByOperator('REGEX', '/^foo/'); +$valid->isValid('foobar'); // true + +$valid = new \Alley\Validator\ValidatorByOperator('NOT IN', ['bar', 'baz']); +$valid->isValid('bar'); // false + +$valid = new \Alley\Validator\ValidatorByOperator('!==', 42); +$valid->isValid(43); // true +``` + +## Validators + +### `AlwaysValid` + +`\Alley\Validator\AlwaysValid` marks all input as valid. It can be used to satisfy type requirements when full validation needs to be disabled or is impractical. + +#### Supported options + +None. + +#### Basic usage + +```php +isValid(42); // true +$valid->isValid(false); // true +$valid->isValid('abcdefghijklmnopqrstuvwxyz'); // true +``` + +### `Comparison` + +`\Alley\Validator\Comparison` compares input to another value using a PHP [comparison operator](https://www.php.net/manual/en/language.operators.comparison.php). The input passes validation if the comparison is true. Input is placed on the left side of the operator. + +#### Supported options + +The following options are supported for `\Alley\Validator\Comparison`: + +- `compared`: The value the inputs are compared to. It is placed on the right side of the operator. +- `operator`: The PHP comparison operator used to compare the input and `compared`. + +#### Basic usage + +```php + '<=', + 'compared' => 100, + ] +); +$valid->isValid(101); // false + +$valid = new \Alley\Validator\Comparison( + [ + 'operator' => '!==', + 'compared' => false, + ] +); +$valid->isValid(true); // true +``` + +### `ContainsString` + +`\Alley\Validator\ContainsString` is a validator around the `str_contains()` function. Each instance of the validator represents the "needle" string and validates whether the string is found within the input "haystack." Inputs will automatically be cast to strings. + +#### Supported options + +The following options are supported for `\Alley\Validator\ContainsString`: + +- `needle`: The string or instance of `\Stringable` the inputs are searched for. It will automatically be cast to a string at the time of validation. +- `ignoreCase`: Whether to perform a case-insensitive search. False by default. + +#### Basic usage + +```php + 'foo', + ], +); + +$valid->isValid('foobar'); // true +$valid->isValid('barbaz'); // false +``` + +### `DivisibleBy` + +`\Alley\Validator\DivisibleBy` allows you to validate whether the input is evenly divisible by a given numeric value. Inputs will automatically be cast to integers. + +#### Supported options + +The following options are supported for `\Alley\Validator\DivisibleBy`: + +- `divisor`: The value the inputs are divided by. It will automatically be cast to an integer. + +#### Basic usage + +```php + 3, + ], +); + +$valid->isValid(9); // true +$valid->isValid(10); // false +``` + +### `Not` + +`Alley\Validator\Not` inverts the validity of a given validator. It allows for creating validators that test whether input is, for example, "not one of" in addition to "one of." + +#### Supported options + +None. + +#### Basic usage + +```php + ['foo', 'bar']]); +$valid = new \Alley\Validator\Not($origin, 'The input was invalid.'); + +$valid->isValid('foo'); // false +$valid->isValid('baz'); // true +``` + +### `OneOf` + +`Alley\Validator\OneOf` validates whether an array of scalar values contains the input. + +`OneOf` is a simpler version of `\Laminas\Validator\InArray` that accepts only scalar values in the haystack and does only strict comparisons. In return, it produces a friendlier error message that lists the allowed values. + +#### Supported options + +The following options are supported for `\Alley\Validator\OneOf`: + +- `haystack`: The array to be searched for the input. + +#### Basic Usage + +```php + ['one', 'two', 'three']]); +$valid->isValid('four'); // false +$valid->getMessages(); // ['notOneOf' => 'Must be one of [one, two, three] but is four.'] +``` + +### `Type` + +`\Alley\Validator\Type` allows you to validate whether the input is of the given PHP type. The input passes if it is the expected type. + +This validator is inspired by PHPUnit's `\PHPUnit\Framework\Constraint\IsType` class. + +#### Supported options + +The following options are supported for `\Alley\Validator\Type`: + +- `type`: The expected PHP type. Supported types are `array`, `bool`, `boolean`, `callable`, `double`, `float`, `int`, `integer`, `iterable`, `null`, `numeric`, `object`, `real`, `resource`, `string`, and `scalar`. + +#### Basic usage + +```php + 'callable']); +$valid->isValid('date_create_immutable'); // true + +$valid = new \Alley\Validator\Type(['type' => 'bool']); +$valid->isValid([]); // false +``` + +### `WithMessage` + +`Alley\Validator\WithMessage` allows you to decorate a validator with a custom failure code and message, replacing the validator's usual failure messages. + +#### Supported options + +None. + +#### Basic usage + +```php +isValid(41); // false +$valid->getMessages(); // ['tooSmall' => 'Please enter a number greater than 42.'] +``` + +## About + +### License + +[GPL-2.0-or-later](https://github.com/alleyinteractive/laminas-validator-extensions/blob/main/LICENSE) + +### Maintainers + +[Alley Interactive](https://github.com/alleyinteractive) diff --git a/vendor/alleyinteractive/laminas-validator-extensions/composer.json b/vendor/alleyinteractive/laminas-validator-extensions/composer.json new file mode 100644 index 00000000..7334a9e2 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/composer.json @@ -0,0 +1,40 @@ +{ + "name": "alleyinteractive/laminas-validator-extensions", + "description": "Additional validation classes for the laminas-validator framework.", + "type": "library", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "autoload": { + "psr-4": { + "Alley\\": "src/Alley/" + } + }, + "autoload-dev": { + "psr-4": { + "Alley\\": "tests/Alley/" + } + }, + "config": { + "lock": false + }, + "require": { + "php": "^8.0", + "laminas/laminas-validator": "^2.20" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.8", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "scripts": { + "fixer": "php-cs-fixer -v fix --allow-risky=yes", + "phpcbf": "phpcbf", + "phpcs": "phpcs", + "phpunit": "phpunit" + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/AlwaysValid.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/AlwaysValid.php new file mode 100644 index 00000000..c2f142a9 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/AlwaysValid.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\ValidatorInterface; + +final class AlwaysValid implements ValidatorInterface +{ + public function isValid($value) + { + return true; + } + + public function getMessages() + { + return []; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/AnyValidator.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/AnyValidator.php new file mode 100644 index 00000000..dd9b0c5d --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/AnyValidator.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Countable; +use Laminas\Validator\ValidatorInterface; +use ReturnTypeWillChange; + +final class AnyValidator implements Countable, ValidatorInterface +{ + /** + * Validator chain. + * + * @var ValidatorInterface[] + */ + protected array $validators = []; + + /** + * Array of validation failure messages. + * + * @var string[] + */ + protected $messages = []; + + /** + * @param ValidatorInterface[] $validators + */ + public function __construct(array $validators) + { + foreach ($validators as $validator) { + $this->attach($validator); + } + } + + /** + * Attach a validator to the end of the chain. + * + * @param ValidatorInterface $validator + * @return self + */ + public function attach(ValidatorInterface $validator) + { + $this->validators[] = $validator; + + return $this; + } + + public function isValid($value) + { + $this->messages = []; + + if ($this->count() === 0) { + // Consistent with `\Laminas\Validator\ValidatorChain()`. + return true; + } + + foreach ($this->validators as $validator) { + if ($validator->isValid($value)) { + return true; + } + } + + foreach ($this->validators as $validator) { + $this->messages = array_replace($this->messages, $validator->getMessages()); + } + + return false; + } + + public function getMessages() + { + return $this->messages; + } + + #[ReturnTypeWillChange] + public function count() + { + return \count($this->validators); + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Comparison.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Comparison.php new file mode 100644 index 00000000..d3d45256 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Comparison.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; + +final class Comparison extends ExtendedAbstractValidator +{ + private const SUPPORTED_OPERATORS = [ + '==', + '===', + '!=', + '<>', + '!==', + '<', + '>', + '<=', + '>=', + ]; + + private const OPERATOR_ERROR_CODES = [ + '==' => 'notEqual', + '===' => 'notIdentical', + '!=' => 'isEqual', + '<>' => 'isEqual', + '!==' => 'isIdentical', + '<' => 'notLessThan', + '>' => 'notGreaterThan', + '<=' => 'notLessThanOrEqualTo', + '>=' => 'notGreaterThanOrEqualTo', + ]; + + protected $messageTemplates = [ + 'notEqual' => 'Must be equal to %compared% but is %value%.', + 'notIdentical' => 'Must be identical to %compared% but is %value%.', + 'isEqual' => 'Must not be equal to %compared% but is %value%.', + 'isIdentical' => 'Must not be identical to %compared%.', + 'notLessThan' => 'Must be less than %compared% but is %value%.', + 'notGreaterThan' => 'Must be greater than %compared% but is %value%.', + 'notLessThanOrEqualTo' => 'Must be less than or equal to %compared% but is %value%.', + 'notGreaterThanOrEqualTo' => 'Must be greater than or equal to %compared% but is %value%.', + ]; + + protected $messageVariables = [ + 'compared' => ['options' => 'compared'], + ]; + + protected $options = [ + 'compared' => null, + 'operator' => '===', + ]; + + protected function testValue($value): void + { + switch ($this->options['operator']) { + case '==': + $result = $value == $this->options['compared']; + break; + case '!=': + case '<>': + $result = $value != $this->options['compared']; + break; + case '!==': + $result = $value !== $this->options['compared']; + break; + case '<': + $result = $value < $this->options['compared']; + break; + case '>': + $result = $value > $this->options['compared']; + break; + case '<=': + $result = $value <= $this->options['compared']; + break; + case '>=': + $result = $value >= $this->options['compared']; + break; + case '===': + default: + $result = $value === $this->options['compared']; + break; + } + + if (!$result) { + $this->error(self::OPERATOR_ERROR_CODES[$this->options['operator']]); + } + } + + protected function setOperator(string $operator) + { + if (!\in_array($operator, self::SUPPORTED_OPERATORS, true)) { + throw new InvalidArgumentException("Invalid 'operator': {$operator}."); + } + + $this->options['operator'] = $operator; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ContainsString.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ContainsString.php new file mode 100644 index 00000000..fa478404 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ContainsString.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\IsInstanceOf; +use Laminas\Validator\ValidatorInterface; + +final class ContainsString extends ExtendedAbstractValidator +{ + public const NOT_CONTAINS_STRING = 'notContainsString'; + + protected $messageTemplates = [ + self::NOT_CONTAINS_STRING => 'Must contain string "%needle%".', + ]; + + protected $messageVariables = [ + 'needle' => ['options' => 'needle'], + ]; + + protected $options = [ + 'needle' => '', + 'ignoreCase' => false, + ]; + + protected function testValue($value): void + { + if (\is_scalar($value)) { + $haystack = (string) $value; + $needle = (string) $this->options['needle']; + + if ($this->options['ignoreCase']) { + $haystack = strtolower($haystack); + $needle = strtolower($needle); + } + + if (str_contains($haystack, $needle)) { + return; + } + } + + $this->error(self::NOT_CONTAINS_STRING); + } + + protected function setNeedle($needle) + { + if (!\is_string($needle) && !\is_null($needle) && !$needle instanceof \Stringable) { + throw new InvalidArgumentException("Invalid 'needle': Must be string or instance of \Stringable"); + } + + $this->options['needle'] = $needle; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/DivisibleBy.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/DivisibleBy.php new file mode 100644 index 00000000..ddc668d1 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/DivisibleBy.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; + +final class DivisibleBy extends ExtendedAbstractValidator +{ + public const NOT_DIVISIBLE_BY = 'notDivisibleBy'; + + protected $messageTemplates = [ + self::NOT_DIVISIBLE_BY => 'Must be evenly divisible by %divisor% but %value% is not.', + ]; + + protected $messageVariables = [ + 'divisor' => ['options' => 'divisor'], + ]; + + protected $options = [ + 'divisor' => 1, + ]; + + protected function testValue($value): void + { + $value = (int) $value; + $actual = $value % $this->options['divisor']; + + if ($actual !== 0) { + $this->error(self::NOT_DIVISIBLE_BY); + } + } + + protected function setDivisor($divisor) + { + $divisor = (int) $divisor; + + if ($divisor === 0) { + throw new InvalidArgumentException("Invalid 'divisor': {$divisor}"); + } + + $this->options['divisor'] = $divisor; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ExtendedAbstractValidator.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ExtendedAbstractValidator.php new file mode 100644 index 00000000..32efb54e --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ExtendedAbstractValidator.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\AbstractValidator; + +abstract class ExtendedAbstractValidator extends AbstractValidator +{ + final public function isValid($value): bool + { + $this->setValue($value); + $this->testValue($this->value); + return \count($this->getMessages()) === 0; + } + + /** + * Apply validation logic and add any validation errors. + * + * @param mixed $value + * @return void + */ + abstract protected function testValue($value): void; +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/FastFailValidatorChain.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/FastFailValidatorChain.php new file mode 100644 index 00000000..c5d36798 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/FastFailValidatorChain.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\ValidatorChain; +use Laminas\Validator\ValidatorInterface; + +final class FastFailValidatorChain implements ValidatorInterface +{ + private ValidatorChain $origin; + + /** + * @param ValidatorInterface[] $validators + */ + public function __construct(array $validators) + { + $this->origin = new ValidatorChain(); + + foreach ($validators as $validator) { + $this->attach($validator); + } + } + + /** + * Attach a validator to the end of the chain. + * + * @param ValidatorInterface $validator + * @return self + */ + public function attach(ValidatorInterface $validator) + { + $this->origin->attach($validator, true); + + return $this; + } + + public function isValid($value): bool + { + return $this->origin->isValid($value); + } + + public function getMessages(): array + { + return $this->origin->getMessages(); + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/FreeformValidator.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/FreeformValidator.php new file mode 100644 index 00000000..69cc2b1b --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/FreeformValidator.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\ValidatorInterface; +use Stringable; + +abstract class FreeformValidator implements ValidatorInterface +{ + private array $messages = []; + + /** + * Apply validation logic and add any validation errors. + * + * @param mixed $value + * @return void + */ + abstract protected function testValue($value): void; + + final public function isValid($value): bool + { + $this->messages = []; + $this->testValue($value); + return \count($this->getMessages()) === 0; + } + + final public function getMessages() + { + return $this->messages; + } + + /** + * Add validation error. + * + * @param string $key Error key. + * @param string $message Message text. + * @return void + */ + final protected function error(string $key, $message): void + { + $this->messages[$key] = (string) $message; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Not.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Not.php new file mode 100644 index 00000000..b6f94c11 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Not.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\ValidatorInterface; + +final class Not implements ValidatorInterface +{ + public const NOT_VALID = 'notValid'; + + private ValidatorInterface $origin; + + private string $message; + + private bool $ran = false; + + public function __construct(ValidatorInterface $origin, string $message) + { + $this->origin = $origin; + $this->message = $message; + } + + public function isValid($value) + { + $this->ran = true; + return !$this->origin->isValid($value); + } + + public function getMessages() + { + $messages = []; + + if ($this->ran && \count($this->origin->getMessages()) === 0) { + $messages[self::NOT_VALID] = $this->message; + } + + return $messages; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/OneOf.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/OneOf.php new file mode 100644 index 00000000..9bf0d6a2 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/OneOf.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\Callback; +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\Explode; +use Laminas\Validator\ValidatorInterface; + +final class OneOf extends ExtendedAbstractValidator +{ + public const NOT_ONE_OF = 'notOneOf'; + + protected $messageTemplates = [ + self::NOT_ONE_OF => "Must be one of %haystack% but is %value%.", + ]; + + protected $messageVariables = [ + 'haystack' => ['options' => 'haystack'], + ]; + + protected $options = [ + 'haystack' => [], + ]; + + protected function testValue($value): void + { + if (!\in_array($value, $this->options['haystack'], true)) { + $this->error(self::NOT_ONE_OF); + } + } + + protected function setHaystack(array $haystack) + { + foreach ($haystack as $item) { + if (!\is_scalar($item)) { + throw new InvalidArgumentException('Haystack must contain only scalar values.'); + } + } + + $this->options['haystack'] = $haystack; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Type.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Type.php new file mode 100644 index 00000000..aef48485 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/Type.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; + +final class Type extends ExtendedAbstractValidator +{ + public const NOT_OF_TYPE = 'notOfType'; + + private const SUPPORTED_TYPES = [ + 'array', + 'bool', + 'boolean', + 'callable', + 'double', + 'float', + 'int', + 'integer', + 'iterable', + 'null', + 'numeric', + 'object', + 'real', + 'resource', + 'scalar', + 'string', + ]; + + protected $messageTemplates = [ + self::NOT_OF_TYPE => "Must be of PHP type '%type%' but %value% is not.", + ]; + + protected $messageVariables = [ + 'type' => ['options' => 'type'], + ]; + + protected $options = [ + 'type' => 'null', + ]; + + protected function testValue($value): void + { + switch ($this->options['type']) { + case 'array': + $result = \is_array($value); + break; + case 'bool': + case 'boolean': + $result = \is_bool($value); + break; + case 'int': + case 'integer': + $result = \is_int($value); + break; + case 'double': + case 'float': + case 'real': + $result = \is_float($value); + break; + case 'numeric': + $result = is_numeric($value); + break; + case 'object': + $result = \is_object($value); + break; + case 'resource': + $result = \is_resource($value); + break; + case 'string': + $result = \is_string($value); + break; + case 'scalar': + $result = \is_scalar($value); + break; + case 'callable': + $result = \is_callable($value); + break; + case 'iterable': + $result = is_iterable($value); + break; + case 'null': + default: + $result = \is_null($value); + break; + } + + if (!$result) { + $this->error(self::NOT_OF_TYPE); + } + } + + protected function setType(string $type) + { + if (!\in_array($type, self::SUPPORTED_TYPES, true)) { + throw new InvalidArgumentException("Invalid 'type': {$type}."); + } + + $this->options['type'] = $type; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ValidatorByOperator.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ValidatorByOperator.php new file mode 100644 index 00000000..de45e48c --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/ValidatorByOperator.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\Regex; +use Laminas\Validator\ValidatorInterface; + +final class ValidatorByOperator implements ValidatorInterface +{ + private ValidatorInterface $final; + + public function __construct(string $operator, $param) + { + // Build validator now so that its constructor runs, just as if the validator had been instantiated directly. + $this->final = $this->validator($operator, $param); + } + + public function isValid($value) + { + return $this->final->isValid($value); + } + + public function getMessages() + { + return $this->final->getMessages(); + } + + private function validator(string $operator, $param) + { + switch ($operator) { + case 'CONTAINS': + case 'NOT CONTAINS': + $validator = new ContainsString([ + 'needle' => $param, + 'ignoreCase' => false, + ]); + break; + + case 'IN': + case 'NOT IN': + $validator = new OneOf([ + 'haystack' => $param, + ]); + break; + + case 'LIKE': + case 'NOT LIKE': + $validator = new ContainsString([ + 'needle' => $param, + 'ignoreCase' => true, + ]); + break; + + case 'REGEX': + case 'NOT REGEX': + $validator = new Regex([ + 'pattern' => $param, + ]); + break; + + default: + $validator = new Comparison([ + 'operator' => $operator, + 'compared' => $param, + ]); + } + + if (str_starts_with($operator, 'NOT ')) { + $validator = new Not($validator, 'Invalid comparison.'); + } + + return $validator; + } +} diff --git a/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/WithMessage.php b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/WithMessage.php new file mode 100644 index 00000000..6c4520a5 --- /dev/null +++ b/vendor/alleyinteractive/laminas-validator-extensions/src/Alley/Validator/WithMessage.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Validator; + +use Laminas\Validator\ValidatorInterface; + +final class WithMessage implements ValidatorInterface +{ + private string $code; + + private string $message; + + private ValidatorInterface $origin; + + public function __construct(string $code, string $message, ValidatorInterface $origin) + { + $this->origin = $origin; + $this->code = $code; + $this->message = $message; + } + + public function isValid($value) + { + return $this->origin->isValid($value); + } + + public function getMessages() + { + $messages = []; + + if (\count($this->origin->getMessages()) > 0) { + $messages[$this->code] = $this->message; + } + + return $messages; + } +} diff --git a/vendor/alleyinteractive/traverse-reshape/.editorconfig b/vendor/alleyinteractive/traverse-reshape/.editorconfig new file mode 100644 index 00000000..4dd55cbe --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig helps maintain consistent coding styles for developers working on the same project across various editors and IDEs. +# See https://editorconfig.org. + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.php] +indent_size = 4 + +[*.xml] +indent_size = 4 diff --git a/vendor/alleyinteractive/traverse-reshape/.gitattributes b/vendor/alleyinteractive/traverse-reshape/.gitattributes new file mode 100644 index 00000000..ff89b167 --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/.gitattributes @@ -0,0 +1,27 @@ +# +# Exclude these files from release archives. +# +# This will also make the files unavailable when using Composer with `--prefer-dist`. +# If you develop using Composer, use `--prefer-source`. +# +# Via WPCS. +# +/.php_cs-fixer.dist.php export-ignore +/phpcs.xml export-ignore +/phpunit.xml export-ignore +/.github export-ignore +/tests export-ignore + +# +# Auto detect text files and perform LF normalization. +# +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +# +* text=auto + +# +# The above will handle all files not found below. +# +*.md text +*.php text +*.inc text diff --git a/vendor/alleyinteractive/traverse-reshape/.gitignore b/vendor/alleyinteractive/traverse-reshape/.gitignore new file mode 100644 index 00000000..f7334559 --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/.gitignore @@ -0,0 +1,5 @@ +vendor +composer.lock +.php_cs.cache +.phpunit.result.cache +.php-cs-fixer.cache diff --git a/vendor/alleyinteractive/traverse-reshape/.php-cs-fixer.dist.php b/vendor/alleyinteractive/traverse-reshape/.php-cs-fixer.dist.php new file mode 100644 index 00000000..5a56cba5 --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/.php-cs-fixer.dist.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$finder = PhpCsFixer\Finder::create()->in([ + __DIR__ . '/src/', + __DIR__ . '/tests/', +]); + +$config = new PhpCsFixer\Config(); +$config->setRules([ + '@PSR12' => true, + '@PHP81Migration' => true, + + 'final_class' => true, + 'native_constant_invocation' => true, + 'native_function_casing' => true, + 'native_function_invocation' => true, + 'native_function_type_declaration_casing' => true, +]); +$config->setFinder($finder); + +return $config; diff --git a/vendor/alleyinteractive/traverse-reshape/CHANGELOG.md b/vendor/alleyinteractive/traverse-reshape/CHANGELOG.md new file mode 100644 index 00000000..f9f211ea --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +This library adheres to [Semantic Versioning](https://semver.org/) and [Keep a CHANGELOG](https://keepachangelog.com/en/1.0.0/). + +## Unreleased + +Nothing yet. + +## 2.0.0 + +### Removed + +- PHP 7.4 support. + +## 1.0.0 + +Initial release. diff --git a/vendor/alleyinteractive/traverse-reshape/LICENSE b/vendor/alleyinteractive/traverse-reshape/LICENSE new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/alleyinteractive/traverse-reshape/README.md b/vendor/alleyinteractive/traverse-reshape/README.md new file mode 100644 index 00000000..f4a39999 --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/README.md @@ -0,0 +1,154 @@ +# traverse/reshape + +`traverse()` and `reshape()` are companion functions that safely break down arrays or objects and put them back together in new shapes. + +## Installation + +Install the latest version with: + +```bash +$ composer require alleyinteractive/traverse-reshape +``` + +## Basic usage + +### traverse + +Traverse an array or an object using a delimiter to find one value or many values. + +```php + [ + 'red' => [ + 'gala', + 'mcintosh', + ], + 'green' => [ + 'granny_smith', + ], + ], +]; + +$obj = (object) [ + 'apples' => (object) [ + 'red' => [ + 'gala', + 'mcintosh', + ], + 'green' => [ + 'granny_smith', + ], + ], +]; + + +$green = \Alley\traverse($arr, 'apples.green'); +// ['granny_smith'] + +$red = \Alley\traverse($obj, 'apples.red'); +// ['gala', 'mcintosh'] + +[$red, $green] = \Alley\traverse($obj, ['apples.red', 'apples.green']); +// ['gala', 'mcintosh'], ['granny_smith'] + +[[$red, $green]] = \Alley\traverse( + $obj, + [ + 'apples' => [ + 'red', + 'green', + ], + ], +); +// ['gala', 'mcintosh'], ['granny_smith'] +// note the extra depth of the return value -- values are nested according to the nesting of the given paths + +[$red] = \Alley\traverse($obj, ['apples' => 'red']); +// ['gala', 'mcintosh'] + +$sweet = \Alley\traverse($arr, 'apples.green.sweet'); +// NULL + +$pears = \Alley\traverse($arr, 'pears'); +// NULL + +$req = getRemoteData(); +[$title, $date] = \Alley\traverse($req, ['title', 'date']); +// $title and $date variables are guaranteed defined regardless of $req + +[[$red, $green], $title] = \Alley\traverse( + [$arr, $req], + [ + '0.apples' => ['red', 'green'], + '1.title', + ] +); +``` + +### reshape + +Declare the shape of a new array or object whose values are extracted from a source array or object with `traverse()`. + +Shapes can be multidimensional. Paths that do not resolve in the source will be `null` in the result. If a path is given without a key, the key will be inferred from the path. Passing an object for a shape returns an object instead of an array. + +```php + 1, + 'title' => [ + 'rendered' => 'Hello world!', + ], + 'content' => [ + 'rendered' => '

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

', + ], + 'categories' => [1], + 'tags' => [], + '_links' => [ + 'self' => [ + [ + 'href' => 'https://www.example.com/wp-json/wp/v2/posts/1', + ], + ], + ], +]; + +\Alley\reshape( + $original, + [ + 'title' => 'title.rendered', + 'dek' => 'meta.dek', + 'content.rendered', + 'term_ids' => (object) [ + 'category' => 'categories', + 'post_tag' => 'tags', + ], + 'json' => '_links.self.0.href', + ] +); + +/* + [ + 'title' => 'Hello world!', + 'dek' => NULL, + 'rendered' => '

Welcome to WordPress...', + 'term_ids' => (object) [ + 'category' => [1], + 'post_tag' => [], + ], + 'json' => 'https://www.example.com/...', + ] +*/ +``` + +## About + +### License + +[GPL-2.0-or-later](https://github.com/alleyinteractive/traverse-reshape/blob/main/LICENSE) + +### Maintainers + +[Alley Interactive](https://github.com/alleyinteractive) diff --git a/vendor/alleyinteractive/traverse-reshape/composer.json b/vendor/alleyinteractive/traverse-reshape/composer.json new file mode 100644 index 00000000..29aa463c --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/composer.json @@ -0,0 +1,43 @@ +{ + "name": "alleyinteractive/traverse-reshape", + "description": "Safely break down arrays or objects, and put them back together in new shapes.", + "type": "library", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "autoload": { + "psr-4": { + "Alley\\": "src/Alley/" + }, + "files": [ + "src/Alley/reshape.php", + "src/Alley/traverse.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Alley\\": "tests/Alley/" + } + }, + "config": { + "lock": false + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.8", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "scripts": { + "fixer": "php-cs-fixer -v fix --allow-risky=yes", + "phpcbf": "phpcbf", + "phpcs": "phpcs", + "phpunit": "phpunit" + } +} diff --git a/vendor/alleyinteractive/traverse-reshape/src/Alley/Internals/Traverser.php b/vendor/alleyinteractive/traverse-reshape/src/Alley/Internals/Traverser.php new file mode 100644 index 00000000..b0dd5a09 --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/src/Alley/Internals/Traverser.php @@ -0,0 +1,179 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley\Internals; + +/** + * Contains the implementation details for the `traverse()` functions. + * + * Internals are not subject to semantic-versioning constraints. + */ +final class Traverser +{ + /** + * Data source. + * + * @var array|object + */ + private $source; + + /** + * Path or array of paths to data. + * + * @var array|string + */ + private $path; + + /** + * Path delimiter. + * + * @var string + */ + private string $delimiter; + + /** + * Found result. + * + * @var mixed + */ + private $result = null; + + /** + * Constructor. + * + * @param array|object $source Data source. + * @param string|array $path The path or array of paths. + * @param string $delimiter Delimiter. + */ + public function __construct($source, $path, string $delimiter) + { + $this->source = $source; + $this->path = $path; + $this->delimiter = $delimiter; + } + + /** + * Create an instance and return the traversed value. + * + * @param mixed ...$args Constructor arguments. + * @return mixed + */ + public static function createAndGet(...$args) + { + $instance = new self(...$args); + return $instance->get(); + } + + /** + * Get the traversed value. + * + * @return mixed + */ + public function get() + { + $this->run(); + + return $this->result; + } + + /** + * Run the traversal. + */ + private function run() + { + if (\is_array($this->path)) { + $this->result = array_reduce(array_keys($this->path), [$this, 'reducePaths'], []); + return; + } + + if (!\is_string($this->path) && !\is_int($this->path)) { + return; + } + + /* + * Convert the path supplied to this instance into an array using the + * delimiter supplied by this instance: + * + * - `0` becomes `[ 0 ]` + * - `foo` becomes `[ 'foo' ]` + * - `foo.bar` becomes `[ 'foo', 'bar' ]` if the delimiter is `.` + */ + $path_pieces = explode($this->delimiter, $this->path); + + /* + * Take the first element from the newly generated array of path pieces, + * and use it as a key to try to find the matching value in the source + * data supplied to this instance. If there is no matching array key or + * object property in the source data, stop. + */ + $key = array_shift($path_pieces); + + if (\is_array($this->source) || $this->source instanceof \ArrayAccess) { + if (!isset($this->source[$key])) { + /* + * `isset()` is used instead of `array_key_exists()` for + * compatibility with `\ArrayAccess`. Nothing is lost by the + * fact that `isset()` returns false for a null value because + * the default value for `$result` is also null, and attempting + * to continue traversing null would still return null. + */ + return; + } + + $this->result = $this->source[$key]; + } elseif (\is_object($this->source)) { + if (!isset($this->source->{$key})) { + return; + } + + $this->result = $this->source->{$key}; + } + + // If there are no more path pieces left to traverse, stop. + if (0 === \count($path_pieces)) { + return; + } + + /* + * Otherwise, there are more pieces left from the path supplied to the + * instance. Traverse the value found for the previous key, using the + * remaining path pieces and the delimiter to create a new string path. + * This process repeats until there are no more path pieces. + */ + $this->result = self::createAndGet($this->result, implode($this->delimiter, $path_pieces), $this->delimiter); + } + + /** + * `array_reduce()` callback to reduce an array of paths into the array of values. + * + * @param array $carry Traversal result. + * @param string|int $key Key in the array of paths to fetch. + * @return array Updated array of results. + */ + private function reducePaths(array $carry, $key): array + { + $source = $this->source; + + /* + * If the key is a non-numeric string, traverse the value in the + * original source at the path specified by the key. + */ + if (!is_numeric($key)) { + $source = self::createAndGet($source, $key, $this->delimiter); + } + + $carry[] = self::createAndGet($source, $this->path[$key], $this->delimiter); + + return $carry; + } +} diff --git a/vendor/alleyinteractive/traverse-reshape/src/Alley/reshape.php b/vendor/alleyinteractive/traverse-reshape/src/Alley/reshape.php new file mode 100644 index 00000000..d602856a --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/src/Alley/reshape.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley; + +/** + * Reshape an array or object into new keys with values traversed from within the original. + * + * @param array|object $source Data source. + * @param array|object $shape An array or object of the new keys for the data and the paths to traverse in + * the source data to find the new values. Multidimensional values can be created + * by passing a fully-formed shape as a value in the array or object. A string value + * without a named key will use the final segment of the string as the key and the + * full string path as the value. + * @param string $delimiter Delimiter. Default is a '.'. + * @return array|object A new associative array or object from the keys and traversal paths of $shape. + */ +function reshape($source, $shape, string $delimiter = '.') +{ + /* + * If a string is included in $shape without a string key, use the last segment + * of the string as the reshaped key and the full string as the path. + */ + $final = array_reduce( + array_keys((array) $shape), + function ($carry, $key) use ($shape, $delimiter) { + $path = traverse($shape, (string) $key); + + if (\is_int($key)) { + $key_pieces = explode($delimiter, $path); + $key = array_pop($key_pieces); + } + + // Later keys replace earlier ones but remain in their given position in the shape. + unset($carry[$key]); + + return $carry + [$key => $path]; + }, + [] + ); + + // Create the desired shape now to preserve the order of its keys during the final merge. + $out = array_fill_keys(array_keys($final), null); + + // Key-value pairs for values that are strings and can be traversed in bulk. + $deferred = []; + + foreach ($final as $key => $path) { + if (\is_string($path)) { + $deferred[$key] = $path; + } else { + // Fill in nested arrays now. + $out[$key] = reshape($source, $path, $delimiter); + } + } + + // Merge the remaining keys on top. + $out = array_merge( + $out, + array_combine( + array_keys($deferred), + traverse($source, array_values($deferred), $delimiter) + ) + ); + + return \is_object($shape) ? (object) $out : $out; +} diff --git a/vendor/alleyinteractive/traverse-reshape/src/Alley/traverse.php b/vendor/alleyinteractive/traverse-reshape/src/Alley/traverse.php new file mode 100644 index 00000000..8ecb056d --- /dev/null +++ b/vendor/alleyinteractive/traverse-reshape/src/Alley/traverse.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Alley; + +/** + * Pluck one or many values from nested arrays or objects using 'dot' notation. + * + * @param array|object $source Data source. + * @param string|array $path The path or array of paths to values separated by $delimiter. + * Any path in array of paths can itself be an array of paths. + * @param string $delimiter Delimiter. Default is a '.'. + * @return mixed The value or values if found or null. + */ +function traverse($source, $path, string $delimiter = '.') +{ + return Internals\Traverser::createAndGet($source, $path, $delimiter); +} diff --git a/vendor/alleyinteractive/wordpress-autoloader/.editorconfig b/vendor/alleyinteractive/wordpress-autoloader/.editorconfig new file mode 100644 index 00000000..0a064551 --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = tab +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{js,css,scss,yml,json,.babelrc}] +indent_style = space +indent_size = 2 diff --git a/vendor/alleyinteractive/wordpress-autoloader/.gitattributes b/vendor/alleyinteractive/wordpress-autoloader/.gitattributes new file mode 100644 index 00000000..f1a5ab0c --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/.gitattributes @@ -0,0 +1,26 @@ +# +# Exclude these files from release archives. +# +# This will also make the files unavailable when using Composer with `--prefer-dist`. +# +# Via WPCS. +# +/.github export-ignore +/phpcs.xml.dist export-ignore +/.phpcs export-ignore +/phpunit.xml export-ignore +/tests export-ignore + +# +# Auto detect text files and perform LF normalization. +# +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +# +* text=auto + +# +# The above will handle all files not found below. +# +*.md text +*.php text +*.inc text diff --git a/vendor/alleyinteractive/wordpress-autoloader/.gitignore b/vendor/alleyinteractive/wordpress-autoloader/.gitignore new file mode 100644 index 00000000..0afacaed --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/.gitignore @@ -0,0 +1,6 @@ +vendor/ +composer.lock +.phpcs.xml +.phpunit.result.cache +.vscode +.idea diff --git a/vendor/alleyinteractive/wordpress-autoloader/CHANGELOG.md b/vendor/alleyinteractive/wordpress-autoloader/CHANGELOG.md new file mode 100644 index 00000000..1a2777c0 --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/CHANGELOG.md @@ -0,0 +1,34 @@ +# Changelog + +All notable changes to `alleyinteractive/wordpress-autoloader` will be +documented in this file. + +## [Unreleased] + +## 1.1.1 - 2022-08-31 + +- Ensure file is still loaded with APCu. + +## 1.1.0 - 2022-08-09 + +- Adding APCu caching of autoloaded classes. +- Adds check to prevent multiple failed calls to autoload a class. + +## 1.0.0 - 2022-05-25 + +## 0.2.0 + +- Supporting PHP 8.1 +- Removing `preg_replace` with `str_*` functions. + +## 0.1.2 + +- Small performance improvement. + +## 0.1.1 + +- Ensure autoloader root path always has a trailing slash. + +## 0.1.0 + +- Initial release. diff --git a/vendor/alleyinteractive/wordpress-autoloader/README.md b/vendor/alleyinteractive/wordpress-autoloader/README.md new file mode 100644 index 00000000..7cc50e69 --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/README.md @@ -0,0 +1,51 @@ +# WordPress Autoloader + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/alleyinteractive/wordpress-autoloader.svg?style=flat-square)](https://packagist.org/packages/alleyinteractive/wordpress-autoloader) +[![Tests](https://github.com/alleyinteractive/wordpress-autoloader/actions/workflows/tests.yml/badge.svg)](https://github.com/alleyinteractive/wordpress-autoloader/actions/workflows/tests.yml) + +A PHP Autoloader that supports the [Wordpress Coding +Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/). For example, a folder that looks like this would be autoloaded as: + +``` +src/class-example-class.php -> Root_Namespace\Example_Class +src/trait-reusable-feature.php -> Root_Namesace\Reusable_Feature +src/feature/class-example-feature.php -> Root_Namespace\Feature\Example_Feature +``` + +Supports `class`, `trait`, `interface`, and `enum` files and any level of +namespaces. + +## Installation + +You can install the package via composer: + +```bash +composer require alleyinteractive/wordpress-autoloader +``` + +## Usage + +```php +Alley_Interactive\Autoloader\Autoloader::generate( + 'Plugin\\Namespace', + __DIR__ . '/src', +)->register(); + +// Or register the autoloader manually. +spl_autoload_register( + Alley_Interactive\Autoloader\Autoloader::generate( + 'Plugin\\Namespace', + __DIR__ . '/src', + ) +); +``` + +## Testing + +```bash +composer test +``` + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. diff --git a/vendor/alleyinteractive/wordpress-autoloader/composer.json b/vendor/alleyinteractive/wordpress-autoloader/composer.json new file mode 100644 index 00000000..ee1441e9 --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/composer.json @@ -0,0 +1,43 @@ +{ + "name": "alleyinteractive/wordpress-autoloader", + "type": "library", + "description": "Autoload files using WordPress File Conventions", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Alley Interactive", + "email": "info@alley.co" + } + ], + "require": { + "php": "^7.4.0|^8.0|^8.1" + }, + "require-dev": { + "alleyinteractive/alley-coding-standards": "^0.3", + "phpunit/phpunit": "^9.5.8" + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "autoload": { + "files": [ + "src/class-autoloader.php" + ] + }, + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": { + "lint": "@phpcs", + "lint:fix": "@phpcbf", + "phpcbf": "phpcbf --standard=./phpcs.xml.dist .", + "phpcs": "phpcs --standard=./phpcs.xml.dist .", + "phpunit": "vendor/bin/phpunit", + "test": [ + "@phpcs", + "@phpunit" + ] + } +} diff --git a/vendor/alleyinteractive/wordpress-autoloader/src/class-autoloader.php b/vendor/alleyinteractive/wordpress-autoloader/src/class-autoloader.php new file mode 100644 index 00000000..f2a08085 --- /dev/null +++ b/vendor/alleyinteractive/wordpress-autoloader/src/class-autoloader.php @@ -0,0 +1,203 @@ + + */ + protected array $missing_classes = []; + + /** + * APCu cache key prefix. + * + * @var ?string + */ + protected ?string $apcu_prefix; + + /** + * Generate an autoloader for the WordPress file naming conventions. + * + * @param string $namespace Namespace to autoload. + * @param string $root_path Path in which to look for files. + * @return static Function for spl_autoload_register(). + */ + public static function generate( string $namespace, string $root_path ): callable { + return new static( $namespace, $root_path ); + } + + /** + * Constructor. + * + * @param string $namespace Namespace to register. + * @param string $root_path Root path of the namespace. + */ + public function __construct( string $namespace, string $root_path ) { + $this->namespace = $namespace; + + // Ensure consistent root. + $this->root_path = rtrim( $root_path, DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $prefix Prefix to use. + * @return static + */ + public function set_apcu_prefix( string $prefix ) { + $this->apcu_prefix = function_exists( 'apcu_fetch' ) && filter_var( ini_get( 'apc.enabled' ), FILTER_VALIDATE_BOOLEAN ) + ? $prefix + : null; + + return $this; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function get_apcu_prefix(): ?string { + return $this->apcu_prefix; + } + + /** + * Check if a class was missing from the autoloader. + * + * @param string $classname Class to check. + * @return bool + */ + public function is_missing_class( string $classname ): bool { + return isset( $this->missing_classes[ $classname ] ); + } + + /** + * Register the autoloader. + */ + public function register() { + spl_autoload_register( $this ); + } + + /** + * Unregister the autoloader. + */ + public function unregister() { + spl_autoload_unregister( $this ); + } + + /** + * Invoke method of the class. + * + * @param string $classname Class being autoloaded. + */ + public function __invoke( string $classname ) { + // Ignore if the base namespace doesn't match. + if ( 0 !== \strpos( $classname, $this->namespace ) ) { + return; + } + + // Check if the class was previously not found. + if ( isset( $this->missing_classes[ $classname ] ) ) { + return; + } + + // Check if the class was previously found with APCu caching. + if ( isset( $this->apcu_prefix ) ) { + $hit = false; + $file = apcu_fetch( $this->apcu_prefix . $classname, $hit ); + + if ( $hit ) { + require_once $file; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable + return $file; + } + } + + $file = $this->find_file( $classname ); + + if ( $file ) { + require_once $file; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable + + // Cache the found file with APCu if enabled. + if ( isset( $this->apcu_prefix ) ) { + apcu_add( $this->apcu_prefix . $classname, $file ); + } + } else { + // Mark the class as not found to save future lookups. + $this->missing_classes[ $classname ] = true; + } + } + + /** + * Find a file for the given class. + * + * @param string $classname Class to find. + * @return string|null + */ + protected function find_file( string $classname ): ?string { + // Break up the classname into parts. + $parts = \explode( '\\', $classname ); + + // Retrieve the class name (last item) and convert it to a filename. + $class = \strtolower( \str_replace( '_', '-', \array_pop( $parts ) ) ); + + $base_path = ''; + + // Build the base path relative to the sub-namespace. + $sub_namespace = \substr( \implode( DIRECTORY_SEPARATOR, $parts ), \strlen( $this->namespace ) ); + + if ( ! empty( $sub_namespace ) ) { + $base_path = \str_replace( '_', '-', \strtolower( $sub_namespace ) ); + } + + // Support multiple locations since the class could be a class, trait or interface. + $paths = [ + '%1$s' . DIRECTORY_SEPARATOR . 'class-%2$s.php', + '%1$s' . DIRECTORY_SEPARATOR . 'trait-%2$s.php', + '%1$s' . DIRECTORY_SEPARATOR . 'interface-%2$s.php', + '%1$s' . DIRECTORY_SEPARATOR . 'enum-%2$s.php', + ]; + + /* + * Attempt to find the file by looping through the various paths. + * + * Autoloading a class will also cause a trait or interface with the + * same fully qualified name to be autoloaded, as it's impossible to + * tell which was requested. + */ + foreach ( $paths as $path ) { + $path = $this->root_path . \sprintf( $path, $base_path, $class ); + + if ( \file_exists( $path ) ) { + return $path; + } + } + + return null; + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/.editorconfig b/vendor/alleyinteractive/wp-match-blocks/.editorconfig new file mode 100644 index 00000000..2708ec41 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig helps maintain consistent coding styles for developers working on the same project across various editors and IDEs. +# See https://editorconfig.org. + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.php] +indent_size = 4 +indent_style = tab + +[*.xml] +indent_size = 4 diff --git a/vendor/alleyinteractive/wp-match-blocks/.gitattributes b/vendor/alleyinteractive/wp-match-blocks/.gitattributes new file mode 100644 index 00000000..1f5f3ab0 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/.gitattributes @@ -0,0 +1,27 @@ +# +# Exclude these files from release archives. +# +# This will also make the files unavailable when using Composer with `--prefer-dist`. +# If you develop using Composer, use `--prefer-source`. +# +# Via WPCS. +# +/.github export-ignore +/.php-cs-fixer.dist.php export-ignore +/phpcs.xml export-ignore +/phpunit.xml export-ignore +/tests export-ignore + +# +# Auto detect text files and perform LF normalization. +# +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +# +* text=auto + +# +# The above will handle all files not found below. +# +*.md text +*.php text +*.inc text diff --git a/vendor/alleyinteractive/wp-match-blocks/.gitignore b/vendor/alleyinteractive/wp-match-blocks/.gitignore new file mode 100644 index 00000000..f7334559 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/.gitignore @@ -0,0 +1,5 @@ +vendor +composer.lock +.php_cs.cache +.phpunit.result.cache +.php-cs-fixer.cache diff --git a/vendor/alleyinteractive/wp-match-blocks/CHANGELOG.md b/vendor/alleyinteractive/wp-match-blocks/CHANGELOG.md new file mode 100644 index 00000000..37d79b99 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/CHANGELOG.md @@ -0,0 +1,52 @@ +# Changelog + +This library adheres to [Semantic Versioning](https://semver.org/) and [Keep a CHANGELOG](https://keepachangelog.com/en/1.0.0/). + +## Unreleased + +Nothing yet. + +## 3.1.0 + +### Changed + +* Reduce uses of validators within validators. + +## 3.0.0 + +### Changed + +* "Classic" blocks, which have inner HTML but no block name, are no longer considered empty. + +## 2.0.1 + +### Fixed + +- Missing `alleyinteractive/composer-wordpress-autoloader` dependency. + +## 2.0.0 + +### Added + +- `with_innerhtml` parameter for matching blocks by their inner HTML. Includes companion `\Alley\WP\Validator\Block_InnerHTML` validator. +- `has_innerblocks` parameter for matching blocks by whether they have inner blocks. Includes companion `\Alley\WP\Validator\Block_InnerBlocks_Count` validator. +- `is_valid` parameter for matching blocks by custom validation logic. +- `CONTAINS` and `NOT CONTAINS` (case-sensitive), and `LIKE` and `NOT LIKE` (case-insensitive) operators to `attrs` parameter. + +### Changed + +- Passing a single block instance will return matches within its inner blocks. + +### Removed + +- PHP 7.4 support. + +## 1.0.1 + +### Fixed + +- Incorrect namespace in `README.md` examples. + +## 1.0.0 + +Initial release. diff --git a/vendor/alleyinteractive/wp-match-blocks/LICENSE b/vendor/alleyinteractive/wp-match-blocks/LICENSE new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/alleyinteractive/wp-match-blocks/README.md b/vendor/alleyinteractive/wp-match-blocks/README.md new file mode 100644 index 00000000..9d4505f1 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/README.md @@ -0,0 +1,669 @@ +# Match Blocks + +`match_blocks()` selects the blocks in post content, or in a given set of blocks, inner blocks, or block HTML, that match the given criteria, such as the block name, block attributes, or position within the set of blocks. + +Blocks can be matched by: + +* Block name or names (`name`) +* Block attributes (`attrs`, `with_attrs`) +* Block inner HTML (`with_innerhtml`) +* The block's positive or negative index within the set (`position`) +* Whether the block represents only space (`skip_empty_blocks`) +* Whether the block has inner blocks (`has_innerblocks`) +* Custom validation classes (`is_valid`) + +Passing matching parameters is optional; all non-empty blocks match by default. + +Additionally: + +* Recursion into inner blocks is supported (`flatten`). +* The set of matching blocks can be limited by size (`limit`) or their position in the set of matches (`nth_of_type`). +* The number of matches can be returned instead of the matched blocks (`count`). +* The companion `match_block()` function reduces the filtered set of results to a single parsed block. +* Passing a single block instance will return matches from its inner blocks. + +`match_blocks()` is powered by a set of block validation classes that utilize the [Laminas Validator](https://docs.laminas.dev/laminas-validator/) framework and [Laminas Validator Extensions](https://github.com/alleyinteractive/laminas-validator-extensions) package. These validators, along with a base class for validating blocks, are included here. [See the validators section for their documentation](#validators). + +## Installation + +Install the latest version with: + +```bash +$ composer require alleyinteractive/wp-match-blocks +``` + +## Basic usage + +Find all paragraph blocks in a post: + +```php + 'core/paragraph' ] ); +``` + +Include paragraphs in inner blocks: + +```php + true, + 'name' => 'core/paragraph', + ] +); +``` + +Get the number of paragraph blocks: + +```php + true, + 'name' => 'core/paragraph', + ] +); +``` + +Get the number of paragraph blocks that are inner blocks of the given group block: + +```php +

' ); + +$count = \Alley\WP\match_blocks( + $blocks[0], + [ + 'count' => true, + 'name' => 'core/paragraph', + ] +); +``` + +Get all paragraphs and headings: + +```php +…', + [ + 'name' => [ 'core/heading', 'core/paragraph' ], + ] +); +``` + +Get only paragraphs that have been explicitly aligned: + +```php + 'core/paragraph', + 'with_attrs' => 'align', + ] +); +``` + +Get only paragraphs that have been right-aligned: + +```php + [ + [ + 'key' => 'align', + 'value' => 'right', + ], + ], + 'name' => 'core/paragraph', + ] +); +``` + +Get only paragraphs that have been aligned, but not to the right: + +```php + [ + [ + 'key' => 'align', + 'value' => 'right', + 'operator' => '!==', + ], + ], + 'name' => 'core/paragraph', + ] +); +``` + +Get only paragraphs that have been aligned to the left or the right: + +```php + [ + [ + 'key' => 'align', + 'value' => [ 'left', 'right' ], + 'operator' => 'IN', + ], + ], + 'name' => 'core/paragraph', + ] +); +``` + +Get all images credited to the Associated Press: + +```php + [ + [ + 'key' => 'credit', + 'value' => '/(The )?Associated Press/i', + 'operator' => 'REGEX', + ], + [ + 'key' => 'credit', + 'value' => 'AP', + ], + 'relation' => 'OR', + ], + 'name' => 'core/image', + ] +); +``` + +Get shortcode blocks with a specific shortcode: + +```php + 'core/shortcode', + 'with_innerhtml' => '[bc_video', + ] +); +``` + +Audit a post for YouTube embed blocks that reference videos that are no longer accessible. + +```php + 'core/embed', + 'attrs' => [ + [ + 'key' => 'providerNameSlug', + 'value' => 'youtube', + ], + ], + 'is_valid' => new \Alley\Validator\Not( new YouTube_Video_Exists(), '…' ), + ], +); +``` + +Get the first three blocks: + +```php + 3, + ] +); +``` + +Get the first three paragraph blocks: + +```php + 3, + 'name' => 'core/paragraph', + ] +); +``` + +Get the third paragraph: + +```php + 'core/paragraph', + 'nth_of_type' => 3, + ] +); + +// Or, skip straight to the parsed block: + +$block = \Alley\WP\match_block( + $post, + [ + 'name' => 'core/paragraph', + 'nth_of_type' => '3n', + ] +); +``` + +Get every third paragraph: + +```php + 'core/paragraph', + 'nth_of_type' => '3n', + ] +); +``` + +Get paragraphs 3-8: + +```php + 'core/paragraph', + 'nth_of_type' => [ 'n+3', '-n+8' ], + ] +); +``` + +Get the block at position 3 in the set if it's a paragraph: + +```php + 'core/paragraph', + 'position' => 3, + ] +); +``` + +Get the last two blocks: + +```php + [ -1, -2 ], + ] +); +``` + +Get all non-empty blocks: + +```php + null, + 'skip_empty_blocks' => false, + ] +); +``` + +Get only blocks with inner blocks: + +```php + true, + ] +); +``` + +Get only blocks without inner blocks: + +```php + false, + ] +); +``` + +## Validators + +This package provides classes for validating blocks based on the [Laminas Validator](https://docs.laminas.dev/laminas-validator/) framework and [Laminas Validator Extensions](https://github.com/alleyinteractive/laminas-validator-extensions) package, plus a custom base block validation class. + +`match_blocks()` also uses these validators internally, and they can be passed as the `is_valid` parameter to `match_blocks()` or used on their own. + +### Base Validator + +The abstract `Alley\WP\Validator\BlockValidator` class extends `Alley\Validator\BaseValidator` and, much like `BaseValidator`, standardizes validation of blocks. + +When extending `BlockValidator`, validation logic goes into a `test_block()` method. `test_block()` always receives a `\WP_Block_Parser_Block` instance; validation will automatically fail if the input is not an instance of `\WP_Block`, `\WP_Block_Parser_Block`, or an array representation of a block. + +### `Block_Attribute` + +`Alley\WP\Validator\Block_Attribute` validates whether the block contains, or does not contain, the specified attribute name, value, or name-value pair. + +The block passes if a name comparison is specified, and the block contains an attribute whose name matches the comparison; if a value comparison is specified, and the block contains an attribute whose value matches the comparison; or if both name and value comparisons are specified, and the block contains an attribute with a matching name and value. + +#### Supported options + +The following options are supported for `Alley\WP\Validator\Block_Attribute`: + +- `key`: The name of a block attribute, or an array of names, or a regular expression pattern. Default none. +- `value`: A block attribute value, or an array of values, or regular expression pattern. Default none. +- `operator`: The operator with which to compare `$value` to block attributes. Accepts `CONTAINS`, `NOT CONTAINS` (case-sensitive), `IN`, `NOT IN`, `LIKE`, `NOT LIKE` (case-insensitive), `REGEX`, `NOT REGEX`, or any operator supported by `\Alley\Validator\Comparison`. Default is `===`. +- `key_operator`: Equivalent to `operator` but for `$key`. + +#### Basic usage + +```php +'; + +$valid = new Alley\WP\Validator\Block_Attribute( + [ + 'key' => 'mediaType', + 'value' => 'image', + ], +); + +$valid = new Alley\WP\Validator\Block_Attribute( + [ + 'key' => [ 'mediaType', 'mediaId' ], + 'key_operator' => 'IN', + ], +); + +$valid = new Alley\WP\Validator\Block_Attribute( + [ + 'key' => '/^media/', + 'key_operator' => 'REGEX', + 'value' => [ 'image', 'video' ], + 'operator' => 'IN', + ], +); + +$valid = new Alley\WP\Validator\Block_Attribute( + [ + 'key' => '/^media/', + 'key_operator' => 'REGEX', + 'value' => [ 'audio', 'document' ], + 'operator' => 'NOT IN', + ], +); +``` +### `Block_InnerHTML` + +`Alley\WP\Validator\Block_InnerHTML` validates whether the block contains, or does not contain, the specified content in its `innerHTML` property. The block passes if it contains an `innerHTML` value that matches the comparison. + +#### Supported options + +The following options are supported for `Alley\WP\Validator\Block_InnerHTML`: + +- `content`: The content to find or a regular expression pattern. +- `operator`: The operator with which to compare `$content` to the block inner HTML. Accepts `CONTAINS`, `NOT CONTAINS` (case-sensitive), `IN`, `NOT IN`, `LIKE`, `NOT LIKE` (case-insensitive), `REGEX`, `NOT REGEX`, or any operator supported by `\Alley\Validator\Comparison`. Default is `LIKE`. + +#### Basic usage + +```php + +//

The goal of this new editor is to make adding rich content to WordPress simple and enjoyable.

+// +// ' + +$valid = new Alley\WP\Validator\Block_InnerHTML( + [ + 'content' => 'wordpress', + 'operator' => 'LIKE', + ], +); + +$valid = new Alley\WP\Validator\Block_InnerHTML( + [ + 'content' => 'WordPress', + 'operator' => 'CONTAINS', + ], +); + +$valid = new Alley\WP\Validator\Block_InnerHTML( + [ + 'content' => '/^\s*

\s*

/', + 'operator' => 'NOT REGEX', + ], +); +``` + +### `Block_Name` + +`Alley\WP\Validator\Block_Name` validates whether a block has a given name or one of a set of names. The block passes validation if the block name is in the set. + +#### Supported options + +The following options are supported for `Alley\WP\Validator\Block_Name`: + +-`name`: The block name or names. + +#### Basic usage + +```php + 'core/paragraph', + ] +); + +$valid = new Alley\WP\Validator\Block_Name( + [ + 'name' => [ 'core/gallery', 'jetpack/slideshow', 'jetpack/tiled-gallery' ], + ] +); +``` + +### `Block_Offset` + +`Alley\WP\Validator\Block_Offset` validates whether the block appears at one of the given numeric offsets within a list of blocks. + +The block matches if it appears at one of the offsets in the list. + +Identity is determined by comparing the `\WP_Block_Parser_Block` instances as arrays. + +#### Supported options + +The following options are supported for `Alley\WP\Validator\Block_Offset`: + +- `blocks`: An array or iterable of blocks. +- `offset`: The expected offset or offsets. Negative offsets count from the end of the list. +- `skip_empty_blocks`: Whether to skip blocks that are "empty" according to the `Nonempty_Block_Validator` when indexing `$blocks`. Default true. + +#### Basic usage + +```php +

Hello, world!

+ + + + +HTML +); + +$valid = new Alley\WP\Validator\Block_Offset( + [ + 'blocks' => $blocks, + 'offset' => 1, + ], +); +$valid->isValid( $blocks[2] ); // true + +$valid = new Alley\WP\Validator\Block_Offset( + [ + 'blocks' => $blocks, + 'offset' => [ 4 ], + 'skip_empty_blocks' => false, + ], +); +$valid->isValid( $blocks[4] ); // true + +$valid = new Alley\WP\Validator\Block_Offset( + [ + 'blocks' => $blocks, + 'offset' => -2, + ], +); +$valid->isValid( $blocks[2] ); // true +``` + +### `Block_InnerBlocks_Count` + +`Alley\WP\Validator\Block_InnerBlocks_Count` validates whether the number of inner blocks in the given block passes the specified comparison. + +The block passes validation if the comparison is true for the count of inner blocks. Inner blocks within inner blocks don't count towards the total. + +#### Supported options + +The following options are supported for `Alley\WP\Validator\Block_InnerBlocks_Count`: + +* `count`: The expected number of inner blocks for the comparison. +* `operator`: The PHP comparison operator used to compare the input block's inner blocks and `count`. + +#### Basic usage + +```php + + + + + +HTML +); + +$valid = new \Alley\WP\Validator\Block_InnerBlocks_Count( + [ + 'count' => 1, + 'operator' => '===', + ] +); +$valid->isValid( $blocks[0] ); // true + +$valid = new \Alley\WP\Validator\Block_InnerBlocks_Count( + [ + 'count' => 0, + 'operator' => '>', + ] +); +$valid->isValid( $blocks[0] ); // true + +$valid = new \Alley\WP\Validator\Block_InnerBlocks_Count( + [ + 'count' => 42, + 'operator' => '<=', + ] +); +$valid->isValid( $blocks[0] ); // true +``` + +### `Nonempty_Block` + +`Alley\WP\Validator\Nonempty_Block` validates that the given block is not "empty" -- for example, not a block representing only line breaks. + +The block passes validation if it has a non-null name. + +#### Supported options + +None. + +#### Basic usage + +```php +isValid( $blocks[0] ); // false +``` + +## About + +### License + +[GPL-2.0-or-later](https://github.com/alleyinteractive/wp-match-blocks/blob/main/LICENSE) + +### Maintainers + +[Alley Interactive](https://github.com/alleyinteractive) diff --git a/vendor/alleyinteractive/wp-match-blocks/composer.json b/vendor/alleyinteractive/wp-match-blocks/composer.json new file mode 100644 index 00000000..37b0535b --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/composer.json @@ -0,0 +1,51 @@ +{ + "name": "alleyinteractive/wp-match-blocks", + "description": "Match WordPress blocks in the given content.", + "type": "library", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "autoload": { + "files": [ + "src/alley/wp/match-blocks.php", + "src/alley/wp/internals/internals.php" + ] + }, + "config": { + "allow-plugins": { + "alleyinteractive/composer-wordpress-autoloader": true, + "dealerdirect/phpcodesniffer-composer-installer": true + }, + "lock": false + }, + "require": { + "php": "^8.0", + "alleyinteractive/composer-wordpress-autoloader": "^1.0.0", + "alleyinteractive/laminas-validator-extensions": "^2.0.0" + }, + "require-dev": { + "alleyinteractive/alley-coding-standards": "^1.0.0", + "friendsofphp/php-cs-fixer": "^3.8", + "mantle-framework/testkit": "^0.9" + }, + "scripts": { + "fixer": "php-cs-fixer -v fix --allow-risky=yes", + "phpcbf": "phpcbf", + "phpcs": "phpcs", + "phpunit": "phpunit" + }, + "extra": { + "wordpress-autoloader": { + "autoload": { + "Alley\\": "src/alley/" + }, + "autoload-dev": { + "Alley\\": "tests/alley/" + } + } + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/internals/internals.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/internals/internals.php new file mode 100644 index 00000000..f32265e3 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/internals/internals.php @@ -0,0 +1,175 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Internals; + +use Alley\Validator\AnyValidator; +use Alley\Validator\FastFailValidatorChain; +use Alley\WP\Validator\Block_Attribute; +use Laminas\Validator\ValidatorInterface; + +/** + * Merge inner blocks into the top-level array of blocks. + * + * @param array $blocks Blocks. + * @return array More blocks. + */ +function flatten_blocks( array $blocks ): array { + $out = []; + + while ( $blocks ) { + $block = array_shift( $blocks ); + $out[] = $block; + + if ( ! empty( $block['innerBlocks'] ) ) { + array_unshift( $blocks, ...$block['innerBlocks'] ); + } + } + + return $out; +} + +/** + * Parse 'attrs' clauses into validators. + * + * @throws \Exception If clauses are malformed. + * + * @param array $args 'attrs' argument. + * @return ValidatorInterface + */ +function parse_attrs_clauses( array $args ): ValidatorInterface { + $relation = 'AND'; + + if ( isset( $args['relation'] ) && 'OR' === strtoupper( $args['relation'] ) ) { + $relation = 'OR'; + } + + unset( $args['relation'] ); + + $chain = []; + + foreach ( $args as $clause ) { + if ( ! \is_array( $clause ) ) { + continue; + } + + if ( isset( $clause['relation'] ) || isset( $clause[0] ) ) { + $chain[] = parse_attrs_clauses( $clause ); + continue; + } + + $chain[] = new Block_Attribute( $clause ); + } + + if ( \count( $chain ) === 0 ) { + throw new \Exception(); + } + + if ( 'AND' === $relation ) { + return new FastFailValidatorChain( $chain ); + } + + // If it's not AND then it's OR. + return new AnyValidator( $chain ); +} + +/** + * Parse the 'nth_of_type' parameter into the matching 1-based indices. + * + * @param int|int[]|string|string[] $args 'nth_of_type' argument. + * @param int $max Total number of available blocks. + * @return int[] Matching indices within the set of available blocks. + */ +function parse_nth_of_type( $args, int $max ): array { + if ( \is_int( $args ) ) { + return [ $args ]; + } + + $args = (array) $args; + + if ( array_filter( $args, 'is_int' ) === $args ) { + return $args; + } + + $selectors = $args; + unset( $selectors['relation'] ); + + $matches = []; + + foreach ( $selectors as $selector ) { + if ( 'odd' === $selector ) { + $selector = '2n+1'; + } + + if ( 'even' === $selector ) { + $selector = '2n'; + } + + if ( preg_match( '/^([+-]?\d+)?(-?n)?([+-]\d+)?$/', $selector, $pieces ) ) { + $a = isset( $pieces[1] ) && \strlen( $pieces[1] ) ? $pieces[1] : null; + $n = $pieces[2] ?? null; + $b = $pieces[3] ?? null; + + if ( ! $n ) { + // Matches '\d'. + return [ (int) $a ]; + } + + if ( $n && '0' === $a ) { + // Matches '0n' or '0n+\d'. + return isset( $b ) ? [ (int) $b ] : []; + } + + $indices = []; + $i = 0; + + while ( true ) { + $next = $i; + + if ( '-n' === $n ) { + $next *= -1; + } + + if ( isset( $a ) ) { + $next *= (int) $a; + } + + if ( isset( $b ) ) { + $next += (int) $b; + } + + if ( $max < abs( $next ) ) { + break; + } + + $indices[] = $next; + $i++; + } + + $matches[] = $indices; + } + } + + if ( ! $matches ) { + return []; + } + + if ( \count( $matches ) === 1 ) { + return $matches[0]; + } + + if ( isset( $args['relation'] ) && 'OR' === $args['relation'] ) { + return array_unique( array_merge( ...$matches ) ); + } + + return array_intersect( ...$matches ); +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/match-blocks.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/match-blocks.php new file mode 100644 index 00000000..2cd52806 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/match-blocks.php @@ -0,0 +1,264 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP; + +use Alley\Validator\FastFailValidatorChain; +use Alley\WP\Validator\Block_InnerHTML; +use Alley\WP\Validator\Block_Name; +use Alley\WP\Validator\Block_Offset; +use Alley\WP\Validator\Block_InnerBlocks_Count; +use Alley\WP\Validator\Nonempty_Block; +use Laminas\Validator\ValidatorInterface; + +/** + * Match blocks within the given content. + * + * @param int|\WP_Post|string|array[]|\WP_Block_Parser_Block|array $source Post ID or object with blocks in `post_content`, string of block HTML, + * array of blocks, or a single block instance. Passing a single block + * will return matches from its inner blocks. + * @param array $args { + * Optional. Array of arguments for matching which blocks to return. The defaults match all non-empty blocks. + * + * @type array $attrs { + * Match blocks with the given attributes. + * + * @type string $relation Optional. The keyword used to join the block attribute clauses. Accepts 'AND', or 'OR'. Default 'AND'. + * @type array ...$0 { + * An array of attribute clause parameters, or another fully formed array of attributes to match. + * + * @type string|string[] $key The name of a block attribute, or an array of names, or a regular + * expression pattern. Default none. + * @type mixed $value A block attribute value, or an array of values, or regular + * expression pattern. Default none. + * @type string $operator The operator with which to compare `$value` to block attributes. + * Accepts `CONTAINS`, `NOT CONTAINS` (case-sensitive), `IN`, `NOT IN`, + * `LIKE`, `NOT LIKE` (case-insensitive), `REGEX`, `NOT REGEX`, or any + * operator supported by `\Alley\Validator\Comparison`. Default `===`. + * @type string $key_operator Equivalent to `$operator` but for `$key`. + * } + * } + * @type bool $count Return the number of found blocks instead of the set. + * @type bool $has_innerblocks Return only blocks that have, or don't have, inner blocks. + * @type ValidatorInterface $is_valid Match blocks that pass the given validator. + * @type bool $flatten Recursively descend into inner blocks, test each one against the + * criteria, and count each towards totals. Default false. + * @type int $limit Extract at most this many blocks. Default `-1`, or no limit. + * @type int|int[]|string|string[] $nth_of_type { + * Extract blocks based on their position in the set of found blocks. + * + * @type string $relation Optional. The keyword used to join 'An+B' selectors if more than one is passed. + * Accepts 'AND', or 'OR'. Default 'AND'. Integer arrays are always joined with 'OR'. + * @type int|int[]|string|string[] ...$0 A 1-based integer index or array of indices, a `An+B` pattern (like the `:nth-child` + * pattern in CSS), or an array of `An+B` patterns for matching 1-based indices. + * } + * @type string|string[] $name Match blocks with this block name or names. + * @type int|int[] $position Match blocks that appear at the given index. A negative index counts from the end. + * Note that all blocks with identical HTML to the matched block will also match. + * @type bool $skip_empty_blocks Ignore blocks representing white space. Default true. + * @type string|string[] $with_attrs Match blocks with non-empty values for this attribute or these attributes. + * Blocks must match all of the given `$with_attrs` and `$attrs`. + * @type string $with_innerhtml Match blocks whose `innerHTML` property contains this content, ignoring case. + * } + * @return array[]|int Array of found blocks or count thereof. + */ +function match_blocks( $source, $args = [] ) { + $args = wp_parse_args( + $args, + [ + 'attrs' => [], + 'count' => false, + 'flatten' => false, + 'has_innerblocks' => null, + 'is_valid' => null, + 'limit' => -1, + 'name' => '', + 'nth_of_type' => null, + 'position' => null, + 'skip_empty_blocks' => true, + 'with_attrs' => [], + 'with_innerhtml' => null, + ], + ); + + $blocks = []; + $error = $args['count'] ? 0 : []; + + if ( $source instanceof \WP_Block_Parser_Block ) { + $source = (array) $source; + } + + if ( \is_array( $source ) ) { + $blocks = $source; + } + + if ( is_numeric( $source ) || $source instanceof \WP_Post ) { + $post = get_post( $source ); + + if ( ! $post ) { + return $error; + } + + $blocks = parse_blocks( $post->post_content ); + } + + if ( \is_string( $source ) ) { + $blocks = parse_blocks( $source ); + } + + if ( \is_array( $blocks ) && isset( $blocks['innerBlocks'] ) ) { + $blocks = $blocks['innerBlocks']; + } + + if ( ! wp_is_numeric_array( $blocks ) || 0 === \count( $blocks ) ) { + return $error; + } + + if ( $args['flatten'] ) { + $blocks = Internals\flatten_blocks( $blocks ); + } + + try { + $validator = new FastFailValidatorChain( [] ); + + if ( $args['skip_empty_blocks'] ) { + $validator->attach( new Nonempty_Block() ); + } + + if ( '' !== $args['name'] ) { + $validator->attach( + new Block_Name( + [ + 'name' => $args['name'], + ], + ), + ); + } + + if ( null !== $args['position'] ) { + $validator->attach( + new Block_Offset( + [ + 'blocks' => $blocks, + 'offset' => $args['position'], + 'skip_empty_blocks' => $args['skip_empty_blocks'], + ], + ), + ); + } + + if ( $args['with_attrs'] ) { + $args['attrs'] = [ + 'relation' => 'AND', + [ + 'key' => (array) $args['with_attrs'], + 'key_operator' => 'IN', + 'value' => '', + 'operator' => '!=', + ], + $args['attrs'], + ]; + } + + if ( $args['attrs'] && \is_array( $args['attrs'] ) ) { + $validator->attach( + Internals\parse_attrs_clauses( $args['attrs'] ), + ); + } + + if ( \is_string( $args['with_innerhtml'] ) || $args['with_innerhtml'] instanceof \Stringable ) { + $validator->attach( + new Block_InnerHTML( + [ + 'content' => $args['with_innerhtml'], + 'operator' => 'LIKE', + ], + ), + ); + } + + if ( null !== $args['has_innerblocks'] ) { + $validator->attach( + new Block_InnerBlocks_Count( + [ + 'count' => 0, + 'operator' => $args['has_innerblocks'] ? '>' : '===', + ], + ), + ); + } + + if ( $args['is_valid'] instanceof ValidatorInterface ) { + $validator->attach( $args['is_valid'] ); + } + } catch ( \Exception $exception ) { + return $error; + } + + // Reduce to matching indices. + $matches = array_map( [ $validator, 'isValid' ], $blocks ); + $matches = array_filter( $matches ); + $matches = array_keys( $matches ); + + if ( null !== $args['nth_of_type'] ) { + // These are 1-based indices. Map them to 0-based. + $nth_of_type = Internals\parse_nth_of_type( $args['nth_of_type'], \count( $matches ) ); + $nth_indices = array_map( + fn( $nth ) => (int) $nth - 1, + $nth_of_type + ); + + // Flip indices into array keys, then intersect with keys of matched blocks. + $nth_as_keys = array_flip( $nth_indices ); + $matches = array_intersect_key( $matches, $nth_as_keys ); + } + + if ( $args['limit'] >= 0 ) { + $matches = \array_slice( $matches, 0, $args['limit'] ); + } + + if ( $args['count'] ) { + return \count( $matches ); + } + + // Flip indices into array keys. + $matches = array_flip( $matches ); + + // Intersect matching keys with keys in original list of blocks. + $matches = array_intersect_key( $blocks, $matches ); + + // Return matched blocks in a new list. + return array_values( $matches ); +} + +/** + * Return the first matching block from `match_blocks()`, if any. + * + * @param array|int|\WP_Post|string $source See `match_blocks()`. + * @param array $args See `match_blocks()`. + * @return array|int|null The found block or null. + */ +function match_block( $source, $args = [] ): ?array { + $args['limit'] = 1; + + $blocks = match_blocks( $source, $args ); + + if ( \is_int( $blocks ) ) { + return $blocks; + } + + if ( isset( $blocks[0] ) && \is_array( $blocks[0] ) ) { + return $blocks[0]; + } + + return null; +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-attribute.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-attribute.php new file mode 100644 index 00000000..ebf3f334 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-attribute.php @@ -0,0 +1,246 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\AlwaysValid; +use Alley\Validator\ValidatorByOperator; +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; +use Traversable; +use WP_Block; +use WP_Block_Parser_Block; +use WP_Error; + +/** + * Validates whether the given block contains the specified attribute. + */ +final class Block_Attribute extends Block_Validator { + /** + * Error code. + * + * @var string + */ + public const NO_MATCHING_KEY = 'no_matching_key'; + + /** + * Error code. + * + * @var string + */ + public const NO_MATCHING_VALUE = 'no_matching_value'; + + /** + * Internal symbol. + * + * @var string + */ + private const UNDEFINED = '__UNDEFINED__'; + + /** + * Array of validation failure message templates. + * + * @var string[] + */ + protected $messageTemplates = [ + self::NO_MATCHING_KEY => '', + self::NO_MATCHING_VALUE => '', + ]; + + /** + * Options for this validator. + * + * @var array + */ + protected $options = [ + 'key' => null, + 'key_operator' => '===', + 'value' => self::UNDEFINED, + 'operator' => '===', + ]; + + /** + * Validates attribute keys based on options. + * + * @var ValidatorInterface + */ + private ValidatorInterface $key_validator; + + /** + * Validates attribute values based on options. + * + * @var ValidatorInterface + */ + private ValidatorInterface $value_validator; + + /** + * Set up. + * + * @param array|Traversable $options Validator options. + */ + public function __construct( $options = null ) { + $this->messageTemplates = [ + self::NO_MATCHING_KEY => __( 'Block must have attribute with eligible key.', 'alley' ), + self::NO_MATCHING_VALUE => __( 'Block must have attribute with eligible value.', 'alley' ), + ]; + + $this->key_validator = new AlwaysValid(); + $this->value_validator = new AlwaysValid(); + + parent::__construct( $options ); + } + + /** + * Sets one or multiple options. Merges new options into existing options, validates them in relation to one + * another, and refreshes the cached validators for the comparisons. + * + * @throws InvalidArgumentException If requested comparisons are invalid. + * + * @param array|Traversable $options Options to set. + * @return self + */ + public function setOptions( $options = [] ) { + $next = $this->options; + + foreach ( $options as $key => $value ) { + if ( \array_key_exists( $key, $next ) ) { + $next[ $key ] = $value; + } + } + + if ( null !== $next['key'] ) { + try { + $this->key_validator = new ValidatorByOperator( $next['key_operator'], $next['key'] ); + } catch ( \Exception $exception ) { + throw new InvalidArgumentException( 'Invalid clause for attribute key: ' . $exception->getMessage() ); + } + } + + if ( self::UNDEFINED !== $next['value'] ) { + try { + $this->value_validator = new ValidatorByOperator( $next['operator'], $next['value'] ); + } catch ( \Exception $exception ) { + throw new InvalidArgumentException( 'Invalid clause for attribute value: ' . $exception->getMessage() ); + } + } + + $options = array_merge( $options, $next ); + + /* + * Temporarily move 'value' option to a new key so that + * `\Laminas\Validator\AbstractValidator::setOptions()` + * doesn't attempt to pass it to `::setValue()`. + */ + $options['val'] = $options['value']; + unset( $options['value'] ); + + return parent::setOptions( $options ); + } + + /** + * Restore 'value' option. + * + * @param mixed $val Value. + */ + protected function setVal( $val ) { + $this->options['value'] = $val; + } + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + protected function test_block( WP_Block_Parser_Block $block ): void { + $attrs = $block->attrs; + + // For each test performed against the attributes, an array of matching attribute indices. + $tests = []; + + // For each test performed against the attributes, the number of failed attributes. + $misses = []; + + [ $hit_indices, $miss_count ] = self::test( + $this->key_validator, + array_keys( $attrs ), + ); + + $tests[] = $hit_indices; + $misses[] = $miss_count; + + if ( ! self::passing( $tests, $misses ) ) { + $this->error( self::NO_MATCHING_KEY ); + return; + } + + [ $hit_indices, $miss_count ] = self::test( + $this->value_validator, + array_values( $attrs ) + ); + + $tests[] = $hit_indices; + $misses[] = $miss_count; + + if ( ! self::passing( $tests, $misses ) ) { + $this->error( self::NO_MATCHING_VALUE ); + return; + } + } + + /** + * Test each of the given values against a configured operator. + * + * @param ValidatorInterface $validator Validator to test against. + * @param array $values Indexed list of values to test. + * @return array The indices of $values that passed the comparison and the + * number of $values that failed the comparison. + */ + private static function test( ValidatorInterface $validator, array $values ): array { + $hit_indices = []; + + foreach ( $values as $i => $value ) { + if ( $validator->isValid( $value ) ) { + $hit_indices[] = $i; + } + } + + return [ $hit_indices, \count( $values ) - \count( $hit_indices ) ]; + } + + /** + * Whether the block is passing validation. + * + * @param array[] $tests Zero or more arrays, each containing the indices of + * attribute keys or values that passed a comparison. + * @param int[] $misses The number of failed comparisons across tests of + * attribute keys and values. + * @return bool + */ + private static function passing( array $tests, array $misses ): bool { + return ( + ( + // No comparisons were specified for key or value. + \count( $tests ) === 0 + // At least one attribute was available on the block to test. + || ( \count( array_merge( ...$tests ) ) > 0 || array_filter( $misses ) ) + ) + && ( + // Both key and value were tested, and at least one index matched in both. + ( \count( $tests ) > 1 && array_intersect( ...$tests ) ) + // Either key or value was tested, and at least one index matched. + || ( \count( $tests ) === 1 ) && \count( ...$tests ) > 0 + // No tests missed, if any ran. + || ! array_filter( $misses ) + ) + ); + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-innerblocks-count.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-innerblocks-count.php new file mode 100644 index 00000000..4960fc3b --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-innerblocks-count.php @@ -0,0 +1,248 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\AlwaysValid; +use Alley\Validator\Comparison; +use Alley\Validator\Not; +use Alley\Validator\WithMessage; +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; +use Traversable; +use WP_Block; +use WP_Block_Parser_Block; +use WP_Error; + +/** + * Validates whether the given block has a number of inner blocks. + */ +final class Block_InnerBlocks_Count extends Block_Validator { + /** + * Array of validation failure message templates. + * + * @var string[] + */ + protected $messageTemplates = [ + 'not_equal' => '', + 'not_identical' => '', + 'is_equal' => '', + 'is_identical' => '', + 'not_less_than' => '', + 'not_greater_than' => '', + 'not_less_than_or_equal_to' => '', + 'not_greater_than_or_equal_to' => '', + 'invalid_comparison' => '', + 'default' => '', + ]; + + /** + * Array of additional variables available for validation failure messages. + * + * @var string[] + */ + protected $messageVariables = [ + 'count' => [ + 'options' => 'count', + ], + ]; + + /** + * Options for this validator. + * + * @var array + */ + protected $options = [ + 'operator' => '>=', + 'count' => 0, + ]; + + /** + * Valid inner block counts based on options. + * + * @var ValidatorInterface + */ + private ValidatorInterface $valid_comparisons; + + /** + * Set up. + * + * @param array|Traversable $options Validator options. + */ + public function __construct( $options = null ) { + $this->localize_templates(); + + $this->valid_comparisons = new Comparison( + [ + 'operator' => $this->options['operator'], + 'compared' => $this->options['count'], + ], + ); + + parent::__construct( $options ); + } + + /** + * Sets one or multiple options. Refreshes the cached validators for the comparisons. + * + * @throws InvalidArgumentException If requested comparisons are invalid. + * + * @param array|Traversable $options Options to set. + * @return self + */ + public function setOptions( $options = [] ) { + parent::setOptions( $options ); + + try { + $this->valid_comparisons = new Comparison( + [ + 'operator' => $this->options['operator'], + 'compared' => $this->options['count'], + ], + ); + } catch ( \Exception $exception ) { + $message = 'Invalid comparison options for count of inner blocks: ' . $exception->getMessage(); + + /* + * Force all blocks to fail validation while the new options are invalid in relation to one another. + * Don't try to undo the work of `parent::setOptions()`, since that might leave the validator in + * an unpredictable state. + */ + $this->valid_comparisons = new WithMessage( + 'invalidComparison', + $message, + new Not( new AlwaysValid(), $message ), + ); + + throw new InvalidArgumentException( $message ); + } + + return $this; + } + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + protected function test_block( WP_Block_Parser_Block $block ): void { + $count = \count( $block->innerBlocks ); + + if ( ! $this->valid_comparisons->isValid( $count ) ) { + $message_keys = array_keys( $this->valid_comparisons->getMessages() ); + + foreach ( $message_keys as $key ) { + $this->error( $this->message( $key ), $count ); + } + } + } + + /** + * Sets the 'count' option. + * + * @param int $count Option. + */ + protected function setCount( $count ) { + $this->options['count'] = (int) $count; + } + + /** + * This validator relies on other validators to perform the final comparison of the inner block count. + * Here, map failure message identifiers from those validators to the ones defined by this validator. + * + * @param string $origin Upstream validator failure message identifier. + * @return string This validator's identifier. + */ + private function message( string $origin ): string { + switch ( $origin ) { + case 'notEqual': + return 'not_equal'; + case 'notIdentical': + return 'not_identical'; + case 'isEqual': + return 'is_equal'; + case 'isIdentical': + return 'is_identical'; + case 'notLessThan': + return 'not_less_than'; + case 'notGreaterThan': + return 'not_greater_than'; + case 'notLessThanOrEqualTo': + return 'not_less_than_or_equal_to'; + case 'notGreaterThanOrEqualTo': + return 'not_greater_than_or_equal_to'; + case 'invalidComparison': + return 'invalid_comparison'; + default: + return 'default'; + } + } + + /** + * Localize message templates. + */ + private function localize_templates(): void { + $neq = sprintf( + /* translators: 1: expected count placeholder, 2: actual count placeholder */ + __( 'Number of inner blocks must be %1$s but is %2$s.', 'alley' ), + '%count%', + '%value%', + ); + + $ieq = sprintf( + /* translators: 1: expected count placeholder */ + __( 'Number of inner blocks must not be %1$s.', 'alley' ), + '%count%', + ); + + $nlt = sprintf( + /* translators: 1: expected count placeholder, 2: actual count placeholder */ + __( 'Number of inner blocks must be less than %1$s but is %2$s.', 'alley' ), + '%count%', + '%value%', + ); + + $ngt = sprintf( + /* translators: 1: expected count placeholder, 2: actual count placeholder */ + __( 'Number of inner blocks must be greater than %1$s but is %2$s.', 'alley' ), + '%count%', + '%value%', + ); + + $nlte = sprintf( + /* translators: 1: expected count placeholder, 2: actual count placeholder */ + __( 'Number of inner blocks must be less than or equal to %1$s but is %2$s.', 'alley' ), + '%count%', + '%value%', + ); + + $ngte = sprintf( + /* translators: 1: expected count placeholder, 2: actual count placeholder */ + __( 'Number of inner blocks must be greater than or equal to %1$s but is %2$s.', 'alley' ), + '%count%', + '%value%', + ); + + $this->messageTemplates = [ + 'not_equal' => $neq, + 'not_identical' => $neq, + 'is_equal' => $ieq, + 'is_identical' => $ieq, + 'not_less_than' => $nlt, + 'not_greater_than' => $ngt, + 'not_less_than_or_equal_to' => $nlte, + 'not_greater_than_or_equal_to' => $ngte, + 'invalid_comparison' => __( 'Invalid comparison options for count of inner blocks.', 'alley' ), + 'default' => __( 'Invalid count of inner blocks.', 'alley' ), + ]; + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-innerhtml.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-innerhtml.php new file mode 100644 index 00000000..429b0279 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-innerhtml.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\ValidatorByOperator; +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; +use Traversable; +use WP_Block; +use WP_Block_Parser_Block; +use WP_Error; + +/** + * Validates whether the given block's inner HTML contains the given content. + */ +final class Block_InnerHTML extends Block_Validator { + /** + * Error code. + * + * @var string + */ + public const NO_MATCHING_INNERHTML = 'no_matching_innerhtml'; + + /** + * Array of validation failure message templates. + * + * @var string[] + */ + protected $messageTemplates = [ + self::NO_MATCHING_INNERHTML => '', + ]; + + /** + * Options for this validator. + * + * @var array + */ + protected $options = [ + 'content' => '', + 'operator' => 'LIKE', + ]; + + /** + * Validates block inner HTML based on options. + * + * @var ValidatorInterface + */ + private ValidatorInterface $valid_html; + + /** + * Set up. + * + * @param array|Traversable $options Validator options. + */ + public function __construct( $options = null ) { + $this->messageTemplates[ self::NO_MATCHING_INNERHTML ] = __( 'Block inner HTML does not match.', 'alley' ); + + $this->valid_html = new ValidatorByOperator( $this->options['operator'], $this->options['content'] ); + + parent::__construct( $options ); + } + + /** + * Sets one or multiple options. Merges new options into existing options, validates them in relation to one + * another, and refreshes the cached validators for the comparisons. + * + * @throws InvalidArgumentException If requested comparisons are invalid. + * + * @param array|Traversable $options Options to set. + * @return self + */ + public function setOptions( $options = [] ) { + $next = $this->options; + + foreach ( $options as $key => $value ) { + if ( \array_key_exists( $key, $next ) ) { + $next[ $key ] = $value; + } + } + + try { + $this->valid_html = new ValidatorByOperator( $next['operator'], $next['content'] ); + } catch ( \Exception $exception ) { + throw new InvalidArgumentException( 'Invalid clause for inner HTML: ' . $exception->getMessage() ); + } + + $options = array_merge( $options, $next ); + + return parent::setOptions( $options ); + } + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + protected function test_block( WP_Block_Parser_Block $block ): void { + if ( ! $this->valid_html->isValid( $block->innerHTML ) ) { + $this->error( self::NO_MATCHING_INNERHTML ); + } + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-name.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-name.php new file mode 100644 index 00000000..8b4330a7 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-name.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\Comparison; +use Laminas\Validator\InArray; +use Laminas\Validator\ValidatorInterface; +use Traversable; +use WP_Block; +use WP_Block_Parser_Block; + +/** + * Validates whether a block has a given name or one of a set of names. + */ +final class Block_Name extends Block_Validator { + /** + * Error code. + * + * @var string + */ + public const NOT_NAMED = 'not_named'; + + /** + * Error code. + * + * @var string + */ + public const NAME_NOT_IN = 'name_not_in'; + + /** + * Array of validation failure message templates. + * + * @var string[] + */ + protected $messageTemplates = [ + self::NOT_NAMED => '', + self::NAME_NOT_IN => '', + ]; + + /** + * Array of additional variables available for validation failure messages. + * + * @var string[] + */ + protected $messageVariables = [ + 'name' => [ + 'options' => 'name', + ], + 'block_name' => 'current_block_name', + ]; + + /** + * Options for this validator. + * + * @var array + */ + protected $options = [ + 'name' => null, + ]; + + /** + * Name of the block under test for use in error messages. + * + * @var string|null + */ + protected ?string $current_block_name = ''; + + /** + * Set up. + * + * @param array|Traversable $options Validator options. + */ + public function __construct( $options = null ) { + $this->messageTemplates[ self::NOT_NAMED ] = sprintf( + /* translators: 1: allowed names placeholder, 2: block name placeholder */ + __( 'Block must be named %1$s; got %2$s.', 'alley' ), + '%name%', + '%block_name%', + ); + $this->messageTemplates[ self::NAME_NOT_IN ] = sprintf( + /* translators: 1: allowed names placeholder, 2: block name placeholder */ + __( 'Block name must be one of %1$s; got %2$s.', 'alley' ), + '%name%', + '%block_name%', + ); + + parent::__construct( $options ); + } + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + protected function test_block( WP_Block_Parser_Block $block ): void { + $allowed = $this->options['name']; + $message = self::NAME_NOT_IN; + + if ( ! \is_array( $allowed ) ) { + $allowed = [ $allowed ]; + $message = self::NOT_NAMED; + } + + if ( ! \in_array( $block->blockName, $allowed, true ) ) { + $this->error( $message ); + } + } + + /** + * Converts the input into a parser block instance to be validated. + * + * @param array|WP_Block|WP_Block_Parser_Block $value Original block. + */ + protected function setValue( $value ) { + parent::setValue( $value ); + + $this->current_block_name = $this->value->blockName; + } + + /** + * Sets the 'name' option. + * + * @param string|string[] $name Names. + */ + protected function setName( $name ) { + $this->options['name'] = $name; + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-offset.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-offset.php new file mode 100644 index 00000000..be72ee2c --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-offset.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\Type; +use Laminas\Validator\Exception\InvalidArgumentException; +use Laminas\Validator\ValidatorInterface; +use Traversable; +use WP_Block; +use WP_Block_Parser_Block; +use WP_Error; + +/** + * Validates whether the given block appears at an offset within a set of blocks. + */ +final class Block_Offset extends Block_Validator { + /** + * Error code. + * + * @var string + */ + public const NOT_AT_OFFSET = 'not_at_offset'; + + /** + * Array of validation failure message templates. + * + * @var string[] + */ + protected $messageTemplates = [ + self::NOT_AT_OFFSET => '', + ]; + + /** + * Array of additional variables available for validation failure messages. + * + * @var string[] + */ + protected $messageVariables = [ + 'offset' => [ + 'options' => 'offset', + ], + ]; + + /** + * Options for this validator. + * + * @var array + */ + protected $options = [ + 'blocks' => [], + 'offset' => 0, + 'skip_empty_blocks' => true, + ]; + + /** + * Blocks that will be used in validation based on options. + * + * @var WP_Block_Parser_Block[] + */ + private array $final_blocks = []; + + /** + * Set up. + * + * @param array|Traversable $options Validator options. + */ + public function __construct( $options = null ) { + $this->messageTemplates[ self::NOT_AT_OFFSET ] = sprintf( + /* translators: %s: offset placeholder */ + __( 'Must be at offset %s within the blocks.', 'alley' ), + '%offset%' + ); + + parent::__construct( $options ); + } + + /** + * Sets one or multiple options. Determines the final set of blocks. + * + * @param array|Traversable $options Options to set. + * @return self + */ + public function setOptions( $options = [] ) { + parent::setOptions( $options ); + + $this->final_blocks = $this->options['blocks']; + + if ( $this->options['skip_empty_blocks'] ) { + $this->final_blocks = array_filter( $this->final_blocks, [ new Nonempty_Block(), 'isValid' ] ); + } + + return $this; + } + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + protected function test_block( WP_Block_Parser_Block $block ): void { + foreach ( (array) $this->options['offset'] as $offset ) { + $check = []; + + /* + * Manually checking negative offsets is required because + * `array_slice()` will return the first item if the negative offset + * is out of bounds. + */ + if ( 0 <= $offset || abs( $offset ) <= \count( $this->final_blocks ) ) { + $check = \array_slice( $this->final_blocks, $offset, 1 ); + } + + if ( isset( $check[0] ) && (array) $check[0] === (array) $block ) { + return; + } + } + + $this->error( self::NOT_AT_OFFSET ); + } + + /** + * Sets the 'blocks' option. + * + * @throws InvalidArgumentException If blocks aren't iterable. + * + * @param array[]|WP_Block[]|WP_Block_Parser_Block[] $blocks Blocks. + */ + protected function setBlocks( $blocks ) { + if ( ! is_iterable( $blocks ) ) { + throw new InvalidArgumentException( 'Blocks must be iterable.' ); + } + + if ( ! $blocks instanceof \Traversable ) { + $blocks = new \ArrayIterator( (array) $blocks ); + } + + $blocks = iterator_to_array( $blocks ); + $blocks = array_map( [ self::class, 'to_parser_block' ], $blocks ); + + $this->options['blocks'] = array_values( $blocks ); + } + + /** + * Sets the 'offset' option. + * + * @param int|int[] $offset Offset or offsets. + */ + protected function setOffset( $offset ) { + $offset = \is_array( $offset ) ? array_map( 'intval', $offset ) : (int) $offset; + + $this->options['offset'] = $offset; + } + + /** + * Sets the 'skip_empty_blocks' option. + * + * @param bool $skip Option. + */ + protected function setSkipEmptyBlocks( $skip ) { + $this->options['skip_empty_blocks'] = (bool) $skip; + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-validator.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-validator.php new file mode 100644 index 00000000..707f9129 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-block-validator.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\ExtendedAbstractValidator; +use Laminas\Validator\Exception\InvalidArgumentException; +use WP_Block; +use WP_Block_Parser_Block; + +/** + * Abstract class for validating WordPress blocks. + */ +abstract class Block_Validator extends ExtendedAbstractValidator { + /** + * Properties that need to be in the submitted block to convert it into a parsed block. + * + * @var string[] + */ + private const REQUIRED_BLOCK_KEYS = [ 'blockName', 'attrs', 'innerBlocks', 'innerHTML', 'innerContent' ]; + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + abstract protected function test_block( WP_Block_Parser_Block $block ): void; + + /** + * Apply validation logic and add any validation errors. + * + * @param mixed $value The value to test. + */ + final protected function testValue( $value ): void { + $this->test_block( $value ); + } + + /** + * Converts the input into a parser block instance to be validated. + * + * @throws InvalidArgumentException If the submitted value can't be parsed into a block. + * + * @param array|WP_Block|WP_Block_Parser_Block $value Original block. + */ + protected function setValue( $value ) { + $value = self::to_parser_block( $value ); + + parent::setValue( $value ); + } + + /** + * Convert a block or a representation thereof to a parser block object. + * + * @throws InvalidArgumentException If input cannot be parsed. + * + * @param array|WP_Block|WP_Block_Parser_Block $value Original block. + * @return WP_Block_Parser_Block|null Block instance. + */ + protected static function to_parser_block( $value ): WP_Block_Parser_Block { + if ( $value instanceof WP_Block ) { + $value = $value->parsed_block; + } + + if ( $value instanceof WP_Block_Parser_Block ) { + $value = (array) $value; + } + + $actual_keys = array_keys( $value ); + + if ( array_diff( self::REQUIRED_BLOCK_KEYS, $actual_keys ) ) { + throw new InvalidArgumentException( __( 'Cannot parse block from input.', 'alley' ) ); + } + + $value = new WP_Block_Parser_Block( + $value['blockName'], + $value['attrs'], + $value['innerBlocks'], + $value['innerHTML'], + $value['innerContent'], + ); + + return $value; + } +} diff --git a/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-nonempty-block.php b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-nonempty-block.php new file mode 100644 index 00000000..f327e579 --- /dev/null +++ b/vendor/alleyinteractive/wp-match-blocks/src/alley/wp/validator/class-nonempty-block.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @package wp-match-blocks + */ + +namespace Alley\WP\Validator; + +use Alley\Validator\AnyValidator; +use Alley\Validator\Not; +use Laminas\Validator\ValidatorInterface; +use Traversable; +use WP_Block_Parser_Block; + +/** + * Validates that the given block is not "empty" -- for example, not a block representing only line breaks. + */ +final class Nonempty_Block extends Block_Validator { + /** + * Error code. + * + * @var string + */ + public const EMPTY_BLOCK = 'empty_block'; + + /** + * Array of validation failure message templates. + * + * @var string[] + */ + protected $messageTemplates = [ + self::EMPTY_BLOCK => '', + ]; + + /** + * Set up. + * + * @param array|Traversable $options Validator options. + */ + public function __construct( $options = null ) { + $this->messageTemplates[ self::EMPTY_BLOCK ] = __( 'Block is empty.', 'alley' ); + + parent::__construct( $options ); + } + + /** + * Apply block validation logic and add any validation errors. + * + * @param WP_Block_Parser_Block $block The block to test. + */ + protected function test_block( WP_Block_Parser_Block $block ): void { + if ( null === $block->blockName && preg_match( '#\S#', $block->innerHTML ) === 0 ) { + $this->error( self::EMPTY_BLOCK ); + } + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/.editorconfig b/vendor/alleyinteractive/wp-type-extensions/.editorconfig new file mode 100644 index 00000000..2708ec41 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig helps maintain consistent coding styles for developers working on the same project across various editors and IDEs. +# See https://editorconfig.org. + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.php] +indent_size = 4 +indent_style = tab + +[*.xml] +indent_size = 4 diff --git a/vendor/alleyinteractive/wp-type-extensions/.gitattributes b/vendor/alleyinteractive/wp-type-extensions/.gitattributes new file mode 100644 index 00000000..8acdd2f5 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/.gitattributes @@ -0,0 +1,28 @@ +# +# Exclude these files from release archives. +# +# This will also make the files unavailable when using Composer with `--prefer-dist`. +# If you develop using Composer, use `--prefer-source`. +# +# Via WPCS. +# +/.github export-ignore +/.php-cs-fixer.dist.php export-ignore +/phpcs.xml export-ignore +/phpstan.neon export-ignore +/phpunit.xml export-ignore +/tests export-ignore + +# +# Auto detect text files and perform LF normalization. +# +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +# +* text=auto + +# +# The above will handle all files not found below. +# +*.md text +*.php text +*.inc text diff --git a/vendor/alleyinteractive/wp-type-extensions/.gitignore b/vendor/alleyinteractive/wp-type-extensions/.gitignore new file mode 100644 index 00000000..f7334559 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/.gitignore @@ -0,0 +1,5 @@ +vendor +composer.lock +.php_cs.cache +.phpunit.result.cache +.php-cs-fixer.cache diff --git a/vendor/alleyinteractive/wp-type-extensions/CHANGELOG.md b/vendor/alleyinteractive/wp-type-extensions/CHANGELOG.md new file mode 100644 index 00000000..e8366294 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +This library adheres to [Semantic Versioning](https://semver.org/) and [Keep a CHANGELOG](https://keepachangelog.com/en/1.0.0/). + +## Unreleased + +Nothing yet. + +## 2.2.0 + +### Added + +- `GTM_Script` feature. + +## 2.1.0 + +### Changed + +- Support use of `WP_CLI_Feature` in WP-CLI packages. + +## 2.0.0 + +### Changed + +- `Features` class renamed `Group`. + +## 1.0.0 + +Initial release. diff --git a/vendor/alleyinteractive/wp-type-extensions/LICENSE b/vendor/alleyinteractive/wp-type-extensions/LICENSE new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/alleyinteractive/wp-type-extensions/README.md b/vendor/alleyinteractive/wp-type-extensions/README.md new file mode 100644 index 00000000..02793eaa --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/README.md @@ -0,0 +1,36 @@ +# Type Extensions + +Type Extensions provides a vocabulary of objects for WordPress projects in the form of interfaces representing those objects and implementations of those interfaces. + +The library is oriented toward a declarative style of development that makes use of object composition, in particular the decorator pattern. + +## Installation + +Install the latest version with: + +```bash +$ composer require alleyinteractive/wp-type-extensions +``` + +## Basic usage + +Learn more about the objects included with Type Extensions in the [documentation for each type](#documentation). + +## Documentation + +- [Feature](docs/feature.md) +- [Post IDs](docs/post-ids.md) +- [Post Queries](docs/post-queries.md) +- [Post Query](docs/post-query.md) +- [Serialized Blocks](docs/serialized-blocks.md) +- [Single Block](docs/single-block.md) + +## About + +### License + +[GPL-2.0-or-later](https://github.com/alleyinteractive/wp-type-extensions/blob/main/LICENSE) + +### Maintainers + +[Alley Interactive](https://github.com/alleyinteractive) diff --git a/vendor/alleyinteractive/wp-type-extensions/composer.json b/vendor/alleyinteractive/wp-type-extensions/composer.json new file mode 100644 index 00000000..7d244188 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/composer.json @@ -0,0 +1,53 @@ +{ + "name": "alleyinteractive/wp-type-extensions", + "description": "PHP interfaces and implementations for WordPress.", + "type": "library", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "config": { + "allow-plugins": { + "alleyinteractive/composer-wordpress-autoloader": true, + "dealerdirect/phpcodesniffer-composer-installer": true + }, + "lock": false + }, + "require": { + "php": "^8.1", + "alleyinteractive/laminas-validator-extensions": "^2.0", + "alleyinteractive/wp-match-blocks": "^3.0", + "spatie/once": "^3.1" + }, + "require-dev": { + "alleyinteractive/alley-coding-standards": "^1.0.0", + "friendsofphp/php-cs-fixer": "^3.8", + "mantle-framework/testkit": "^0.9", + "szepeviktor/phpstan-wordpress": "^1.1" + }, + "autoload-dev": { + "psr-4": { + "Alley\\": "tests/alley/" + } + }, + "extra": { + "wordpress-autoloader": { + "autoload": { + "Alley\\": "src/alley/" + }, + "autoload-dev": { + "Alley\\": "tests/alley/" + } + } + }, + "scripts": { + "fixer": "php-cs-fixer -v fix --allow-risky=yes", + "phpcbf": "phpcbf", + "phpcs": "phpcs", + "phpstan": "phpstan --memory-limit=512M", + "phpunit": "phpunit" + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/docs/feature.md b/vendor/alleyinteractive/wp-type-extensions/docs/feature.md new file mode 100644 index 00000000..6d4a38c1 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/docs/feature.md @@ -0,0 +1,53 @@ +# Feature interface + +The `Feature` interface describes a project feature. Features can be large or small, although smaller features can take advantage of decorators more easily. Use the `boot()` method to add actions and filters. Group related features with the `Features` class. + +## Definition + +```php +interface Feature { + public function boot(): void; +} +``` + +## Bundled implementations + +- [Conditional_Feature](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-conditional-feature.php): Boot a feature only when a condition is met. +- [Group](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-group.php): Group related features. +- [GTM_Script](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-gtm-script.php): Add the standard Google Tag Manager script and data layer. +- [Lazy_Feature](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-lazy-feature.php): Instantiate a feature only when called upon. +- [Quick_Feature](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-quick-feature.php): Make a callable a feature. +- [Template_Feature](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-template-feature.php): Boot a feature only when templates load. +- [WP_CLI_Feature](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/features/class-wp-cli-feature.php): Boot a feature only WP-CLI loads. + +## Basic usage + +```php +use Alley\WP\Features\Group; +use Alley\WP\Features\Quick_Feature; +use Alley\WP\Features\Template_Feature; + +$queries = new Project\Post_Queries_Implementation( + /* ... */ +); + +$project = new Group( + new Group( + new Project\Ads_Backend_Feature(), + new Template_Feature( + origin: new Project\Ads_Frontend_Feature(), + ), + ), + new Project\Other_Feature( + queries: $queries, + ), + new Quick_Feature( + function () { + remove_action( /* ... */ ); + remove_filter( /* ... */ ); + }, + ) +); + +$project->boot(); +``` diff --git a/vendor/alleyinteractive/wp-type-extensions/docs/post-ids.md b/vendor/alleyinteractive/wp-type-extensions/docs/post-ids.md new file mode 100644 index 00000000..ba8c282f --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/docs/post-ids.md @@ -0,0 +1,21 @@ +# Post IDs interface + +The `Post_IDs` interface describes an object containing post IDs, such as the IDs in a query or a curated set of featured posts. + +## Definition + +```php +interface Post_IDs { + public function post_ids(): array; +} +``` + +## Bundled implementations + +- [Empty_Post_IDs](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-ids/class-empty-post-ids.php): No post IDs. +- [Post_IDs_Envelope](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-ids/class-post-ids-envelope.php): Instance from an existing set of IDs. +- [Post_IDs_Once](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-ids/class-post-ids-once.php): Always returns the same set of IDs from the original instance. +- [Used_Post_IDs](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-ids/class-used-post-ids.php): Track post IDs that have been used, e.g. while rendering a page. +- [WP_Query_Post_IDs](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-ids/class-wp-query-post-ids.php): The post IDs from a `WP_Query`. + +All `Post_Query` implementations also implement `Post_IDs`. diff --git a/vendor/alleyinteractive/wp-type-extensions/docs/post-queries.md b/vendor/alleyinteractive/wp-type-extensions/docs/post-queries.md new file mode 100644 index 00000000..4737c0da --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/docs/post-queries.md @@ -0,0 +1,20 @@ +# Post Queries interface + +The `Post_Queries` interface describes an object that contains queries for posts. + +## Definition + +```php +interface Post_Queries { + public function query( array $args ): Post_Query; +} +``` + +## Bundled implementations + +- [Default_Post_Queries](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-queries/class-default-post-queries.php): Queries implementation for most cases. +- [Enforced_Date_Queries](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-queries/class-enforced-date-queries.php): Queries that enforce a date query. +- [Exclude_Queries](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-queries/class-exclude-queries.php): Queries that exclude some posts. +- [Memoized_Post_Queries](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-queries/class-memoized-post-queries.php): Reuse queries given the same arguments. +- [Optimistic_Date_Queries](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-queries/class-optimistic-date-queries.php): Speculate (but don't require) that queries can be limited to posts published after the given dates. +- [Variable_Post_Queries](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-queries/class-variable-post-queries.php): Choose queries based on the result of a validation test. diff --git a/vendor/alleyinteractive/wp-type-extensions/docs/post-query.md b/vendor/alleyinteractive/wp-type-extensions/docs/post-query.md new file mode 100644 index 00000000..9921a93f --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/docs/post-query.md @@ -0,0 +1,19 @@ +# Post Query interface + +The `Post_Query` interface describes an object that contains a single query for posts. + +## Definition + +```php +interface Post_Query extends Post_IDs { + public function query_object(): WP_Query; + + public function post_objects(): array; +} +``` + +## Bundled implementations + +- [Global_Post_Query](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-query/class-global-post-query.php): Post_Query for a query in `$GLOBALS`. +- [Post_IDs_Query](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-query/class-post-ids-query.php): Query from post IDs. +- [WP_Query_Envelope](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/post-query/class-wp-query-envelope.php): Post_Query from an existing query. diff --git a/vendor/alleyinteractive/wp-type-extensions/docs/serialized-blocks.md b/vendor/alleyinteractive/wp-type-extensions/docs/serialized-blocks.md new file mode 100644 index 00000000..315af69c --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/docs/serialized-blocks.md @@ -0,0 +1,22 @@ +# Serialized Blocks interface + +The `Serialized_Blocks` interface describes an object containing blocks that can be serialized to block markup. Any string can be serialized to block markup via the `Block_Content` class. + +## Definition + +```php +interface Serialized_Blocks { + public function serialized_blocks(): string; +} +``` + +## Bundled implementations + +- [Blocks](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-blocks.php): Bundle many blocks. +- [Each_Replaced_Blocks](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-each-replaced-blocks.php): Replace each matched block with other block content. +- [Matched_Blocks](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-matched-blocks.php): Blocks matched with `match_blocks()`. +- [Block_Content](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-block-content.php): Blocks in the given content. +- [Lazy_Blocks](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-lazy-blocks.php): Instantiate blocks only when called upon. + +All `Single_Block` implementations also implement `Serialized_Blocks`. + diff --git a/vendor/alleyinteractive/wp-type-extensions/docs/single-block.md b/vendor/alleyinteractive/wp-type-extensions/docs/single-block.md new file mode 100644 index 00000000..b31a823e --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/docs/single-block.md @@ -0,0 +1,20 @@ +# Single Block interface + +The `Single_Block` interface describes an object containing a single block. + +## Definition + +```php +interface Single_Block { + public function block_name(): ?string; + + public function parsed_block(): array; +} +``` + +## Bundled implementations + +- [Named_Block](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-named-block.php): A single block with the given block name. +- [Parsed_Block](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-parsed-block.php): A single parsed block. +- [Default_Classname_Block](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-default-classname-block.php): Block wrapped in the block default classname. +- [Inner_Blocks_Prepended](https://github.com/alleyinteractive/wp-type-extensions/blob/main/src/alley/wp/blocks/class-inner-blocks-prepended.php): Block with prepended inner blocks. diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-block-content.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-block-content.php new file mode 100644 index 00000000..a7edbd05 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-block-content.php @@ -0,0 +1,33 @@ +content; + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-blocks.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-blocks.php new file mode 100644 index 00000000..545ea9a8 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-blocks.php @@ -0,0 +1,68 @@ +blocks = $blocks; + } + + /** + * Serialized block content. + * + * @return string + */ + public function serialized_blocks(): string { + return array_reduce( + $this->blocks, + fn ( string $carry, Serialized_Blocks $block ) => $carry .= $block->serialized_blocks(), + '', + ); + } + + /** + * Constructor for creating blocks from a set of values. + * + * @phpstan-param iterable $values + * @phpstan-param callable(Serialized_Blocks[] $carry, mixed $item, mixed $index, iterable $values): Serialized_Blocks[] $reduce + * + * @param iterable $values Values. + * @param callable $reduce Reducer callback that produces block instances. + * @return Serialized_Blocks + */ + public static function from_iterable( iterable $values, callable $reduce ): Serialized_Blocks { + return new Lazy_Blocks( + function () use ( $values, $reduce ) { + $carry = []; + + foreach ( $values as $index => $item ) { + $carry = ( $reduce )( $carry, $item, $index, $values ); + } + + return new Blocks( ...$carry ); + } + ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-default-classname-block.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-default-classname-block.php new file mode 100644 index 00000000..e8c2f2a9 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-default-classname-block.php @@ -0,0 +1,65 @@ +origin->block_name(); + } + + /** + * Parsed block. + * + * @return mixed[] + */ + public function parsed_block(): array { + $out = $this->origin->parsed_block(); + + $before = sprintf( + '<%s class="%s">', + tag_escape( $this->element ), + wp_get_block_default_classname( (string) $this->block_name() ), + ); + $after = sprintf( '', tag_escape( $this->element ) ); + + $out['innerHTML'] = $before . $out['innerHTML'] . $after; + $out['innerContent'] = [ $before, ...$out['innerContent'], $after ]; + + return $out; + } + + /** + * Serialized block content. + * + * @return string + */ + public function serialized_blocks(): string { + return serialize_block( $this->parsed_block() ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-each-replaced-blocks.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-each-replaced-blocks.php new file mode 100644 index 00000000..f9b66ff9 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-each-replaced-blocks.php @@ -0,0 +1,50 @@ +origin->serialized_blocks(); + + $needles = parse_blocks( $this->find->serialized_blocks() ); + + if ( \is_array( $needles ) && count( $needles ) > 0 ) { + foreach ( $needles as $needle ) { + if ( \is_array( $needle ) ) { + $pbn = new Parsed_Block( $needle ); + $out = str_replace( $pbn->serialized_blocks(), $this->replace->serialized_blocks(), $out ); + } + } + } + + return $out; + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-inner-blocks-prepended.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-inner-blocks-prepended.php new file mode 100644 index 00000000..183a1918 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-inner-blocks-prepended.php @@ -0,0 +1,71 @@ +target->block_name(); + } + + /** + * Parsed block. + * + * @return mixed[] + */ + public function parsed_block(): array { + $out = $this->target->parsed_block(); + $add = parse_blocks( $this->block->serialized_blocks() ); + + if ( + \is_array( $add ) + && isset( $out['innerBlocks'], $out['innerContent'] ) + && \is_array( $out['innerBlocks'] ) + && \is_array( $out['innerContent'] ) + ) { + $out['innerBlocks'] = array_merge( $add, $out['innerBlocks'] ); + $out['innerContent'] = array_merge( + array_fill( 0, \count( $add ), null ), + $out['innerContent'], + ); + } + + return $out; + } + + /** + * Serialized block content. + * + * @return string + */ + public function serialized_blocks(): string { + $pb = new Parsed_Block( $this->parsed_block() ); + return $pb->serialized_blocks(); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-lazy-blocks.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-lazy-blocks.php new file mode 100644 index 00000000..f4329b4e --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-lazy-blocks.php @@ -0,0 +1,33 @@ +final )()->serialized_blocks(); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-matched-blocks.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-matched-blocks.php new file mode 100644 index 00000000..7a8784da --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-matched-blocks.php @@ -0,0 +1,39 @@ + $args Args for {@see match_blocks()}. + * @param Serialized_Blocks $origin Blocks to search. + */ + public function __construct( + private readonly array $args, + private readonly Serialized_Blocks $origin, + ) {} + + /** + * Serialized block content. + * + * @return string + */ + public function serialized_blocks(): string { + $matched = match_blocks( $this->origin->serialized_blocks(), $this->args ); + + return \is_array( $matched ) ? serialize_blocks( $matched ) : ''; + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-named-block.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-named-block.php new file mode 100644 index 00000000..6b1c2e2c --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-named-block.php @@ -0,0 +1,61 @@ + $attrs Block attributes. + * @param string $inner_html Block inner HTML. + */ + public function __construct( + private readonly string $block_name, + private readonly array $attrs = [], + private readonly string $inner_html = '', + ) {} + + /** + * Block name. + * + * @return string + */ + public function block_name(): string { + return $this->block_name; + } + + /** + * Parsed block. + * + * @return mixed[] + */ + public function parsed_block(): array { + return [ + 'blockName' => $this->block_name, + 'attrs' => $this->attrs, + 'innerBlocks' => [], + 'innerHTML' => $this->inner_html, + 'innerContent' => [ $this->inner_html ], + ]; + } + + /** + * Serialized block content. + * + * @return string + */ + public function serialized_blocks(): string { + return serialize_block( $this->parsed_block() ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-parsed-block.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-parsed-block.php new file mode 100644 index 00000000..9acb4679 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/blocks/class-parsed-block.php @@ -0,0 +1,63 @@ +origin['blockName'] ) && \is_string( $this->origin['blockName'] ) ? $this->origin['blockName'] : null; + } + + /** + * Parsed block. + * + * @return mixed[] + */ + public function parsed_block(): array { + $attrs = isset( $this->origin['attrs'] ) && \is_array( $this->origin['attrs'] ) ? $this->origin['attrs'] : []; + $inner_blocks = isset( $this->origin['innerBlocks'] ) && \is_array( $this->origin['innerBlocks'] ) ? $this->origin['innerBlocks'] : []; + $inner_html = isset( $this->origin['innerHTML'] ) && \is_string( $this->origin['innerHTML'] ) ? $this->origin['innerHTML'] : ''; + $inner_content = isset( $this->origin['innerContent'] ) && \is_array( $this->origin['innerContent'] ) ? $this->origin['innerContent'] : []; + + return (array) new WP_Block_Parser_Block( + $this->block_name(), // @phpstan-ignore-line + $attrs, + $inner_blocks, + $inner_html, + $inner_content, + ); + } + + /** + * Serialized block content. + * + * @return string + */ + public function serialized_blocks(): string { + return serialize_block( $this->parsed_block() ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/class-legal-object-ids.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/class-legal-object-ids.php new file mode 100644 index 00000000..9eddb28a --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/class-legal-object-ids.php @@ -0,0 +1,33 @@ +origin->post_ids(), fn ( $id ) => $id > 0 ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-conditional-feature.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-conditional-feature.php new file mode 100644 index 00000000..3e9d82d4 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-conditional-feature.php @@ -0,0 +1,40 @@ +value ) ? ( $this->value )() : $this->value; + + if ( $this->test->isValid( $value ) ) { + $this->if_true->boot(); + } + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-group.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-group.php new file mode 100644 index 00000000..81959f26 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-group.php @@ -0,0 +1,40 @@ +features = $features; + } + + /** + * Boot the feature. + */ + public function boot(): void { + foreach ( $this->features as $feature ) { + $feature->boot(); + } + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-gtm-script.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-gtm-script.php new file mode 100644 index 00000000..b996700d --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-gtm-script.php @@ -0,0 +1,81 @@ + $data_layer + * + * @param string $tag_id GTM tag ID. + * @param array|stdClass|JsonSerializable $data_layer Initial data layer data. + */ + public function __construct( + private readonly string $tag_id, + private readonly array|stdClass|JsonSerializable $data_layer, + ) {} + + /** + * Boot the feature. + */ + public function boot(): void { + add_action( 'wp_head', [ $this, 'render_head' ] ); + add_action( 'wp_body_open', [ $this, 'render_body' ] ); + } + + /** + * Render the GTM tag in the document body. + */ + public function render_head(): void { + $data = $this->data_layer instanceof JsonSerializable ? $this->data_layer : (object) $this->data_layer; + $flags = WP_DEBUG ? JSON_PRETTY_PRINT : 0; + + printf( + <<<'HTML' + + + + + +HTML, + wp_json_encode( $data, $flags ), + wp_json_encode( $this->tag_id, $flags ), + ); + } + + /** + * Render the GTM tag in the document body. + */ + public function render_body(): void { + printf( + <<<'HTML' + + + +HTML, + esc_url( "https://www.googletagmanager.com/ns.html?id={$this->tag_id}" ), + ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-lazy-feature.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-lazy-feature.php new file mode 100644 index 00000000..5d06aeec --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-lazy-feature.php @@ -0,0 +1,31 @@ +final )()->boot(); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-quick-feature.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-quick-feature.php new file mode 100644 index 00000000..8aead9c7 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-quick-feature.php @@ -0,0 +1,31 @@ +fn )(); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-template-feature.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-template-feature.php new file mode 100644 index 00000000..93489df7 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-template-feature.php @@ -0,0 +1,31 @@ +origin, 'boot' ] ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-wp-cli-feature.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-wp-cli-feature.php new file mode 100644 index 00000000..127c5013 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/features/class-wp-cli-feature.php @@ -0,0 +1,42 @@ +origin, 'boot' ] ); + } elseif ( class_exists( 'WP_CLI' ) ) { + /* + * This is being invoked in a WP-CLI package or in a similar context where + * WordPress hasn't yet been loaded. + * + * @see https://github.com/buddypress/wp-cli-buddypress/issues/18 + */ + WP_CLI::add_hook( 'before_wp_load', [ $this->origin, 'boot' ] ); + } + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-empty-post-ids.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-empty-post-ids.php new file mode 100644 index 00000000..62e4b162 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-empty-post-ids.php @@ -0,0 +1,24 @@ +post_ids ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-post-ids-once.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-post-ids-once.php new file mode 100644 index 00000000..6a807e67 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-post-ids-once.php @@ -0,0 +1,33 @@ +origin, 'post_ids' ] ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-used-post-ids.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-used-post-ids.php new file mode 100644 index 00000000..9f92187c --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-used-post-ids.php @@ -0,0 +1,57 @@ + + */ + private array $ids = []; + + /** + * Set up. + * + * @param Post_IDs $seed Initial post IDs. + */ + public function __construct( + private readonly Post_IDs $seed = new Empty_Post_IDs() + ) {} + + /** + * Post IDs. + * + * @return int[] + */ + public function post_ids(): array { + return array_merge( array_keys( $this->ids ), $this->seed->post_ids() ); + } + + /** + * Record used post IDs. + * + * @param int|int[] $post_ids Post ID or IDs. + */ + public function record( int|array $post_ids ): void { + if ( \is_int( $post_ids ) ) { + $post_ids = [ $post_ids ]; + } + + foreach ( $post_ids as $post_id ) { + if ( \is_int( $post_id ) ) { + $this->ids[ $post_id ] = true; + } + } + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-wp-query-post-ids.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-wp-query-post-ids.php new file mode 100644 index 00000000..e5d2f4a0 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-ids/class-wp-query-post-ids.php @@ -0,0 +1,67 @@ +query->posts ) ) { + $ids = array_map( [ self::class, 'to_post_id' ], $this->query->posts ); + } + + return $ids; + } + + /** + * Get the ID from a post object, ID, or ID-parent object. + * + * @param WP_Post|int|object $value Post-like object or ID. + * @return int Post ID. + */ + private static function to_post_id( $value ): int { + $id = 0; + + if ( $value instanceof WP_Post ) { + $id = $value->ID; + } + + // fields => 'ids'. + if ( is_numeric( $value ) ) { + $id = $value; + } + + // fields => 'id=>parent'. + if ( ( $value instanceof \stdClass ) && isset( $value->ID ) ) { + $id = $value->ID; + } + + return (int) $id; + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-default-post-queries.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-default-post-queries.php new file mode 100644 index 00000000..ee99de3e --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-default-post-queries.php @@ -0,0 +1,28 @@ + $args The arguments to be used in the query. + * @return Post_Query + */ + public function query( array $args ): Post_Query { + return new WP_Query_Envelope( new WP_Query( $args ) ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-enforced-date-queries.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-enforced-date-queries.php new file mode 100644 index 00000000..3f4096d0 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-enforced-date-queries.php @@ -0,0 +1,64 @@ + $args The arguments to be used in the query. + * @return Post_Query + */ + public function query( array $args ): Post_Query { + $with_date_query = $this->with_date_query( $args, $this->after ); + + return $this->origin->query( $with_date_query ); + } + + /** + * Add 'after' date query with the given date. + * + * @param array $args Query arguments. + * @param DateTimeInterface $after Date instance. + * @return array + */ + private function with_date_query( array $args, DateTimeInterface $after ): array { + if ( ! isset( $args['date_query'] ) || ! \is_array( $args['date_query'] ) ) { + $args['date_query'] = []; + } + + $args['date_query']['relation'] = 'AND'; + $args['date_query'][] = [ + 'after' => [ + 'year' => $after->format( 'Y' ), + 'month' => $after->format( 'n' ), + 'day' => $after->format( 'j' ), + ], + ]; + + return $args; + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-exclude-queries.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-exclude-queries.php new file mode 100644 index 00000000..f37545ec --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-exclude-queries.php @@ -0,0 +1,58 @@ + $args The arguments to be used in the query. + * @return Post_Query + */ + public function query( array $args ): Post_Query { + $excluded_post_ids = $this->exclude->post_ids(); + $expected_per_page = $this->default_per_page; + + if ( isset( $args['posts_per_page'] ) && is_numeric( $args['posts_per_page'] ) ) { + $expected_per_page = (int) $args['posts_per_page']; + } + + // Ask for the number of posts we expect to return, plus the number of posts to exclude. + $args['posts_per_page'] = $expected_per_page + \count( $excluded_post_ids ); + $overfetched_query = $this->origin->query( $args ); + + // Remove the excluded from the overfetched query. + $diff_post_ids = array_diff( $overfetched_query->post_ids(), $excluded_post_ids ); + + // Slice the number of posts we expect to return from the overfetched query. + $per_page_post_ids = \array_slice( $diff_post_ids, 0, $expected_per_page ); + + return new Post_IDs_Query( $per_page_post_ids ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-memoized-post-queries.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-memoized-post-queries.php new file mode 100644 index 00000000..f36d9301 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-memoized-post-queries.php @@ -0,0 +1,35 @@ + $args The arguments to be used in the query. + * @return Post_Query + */ + public function query( array $args ): Post_Query { + return once( fn () => $this->origin->query( $args ) ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-optimistic-date-queries.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-optimistic-date-queries.php new file mode 100644 index 00000000..bfc9b719 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-optimistic-date-queries.php @@ -0,0 +1,58 @@ +after, fn ( $a, $b ) => $b <=> $a ); + } + + /** + * Query for posts using literal arguments. + * + * @param array $args The arguments to be used in the query. + * @return Post_Query + */ + public function query( array $args ): Post_Query { + $expected_count = $this->posts_per_page; + + if ( isset( $args['posts_per_page'] ) && is_numeric( $args['posts_per_page'] ) ) { + $expected_count = (int) $args['posts_per_page']; + } + + foreach ( $this->after as $after ) { + $with_date_query = new Enforced_Date_Queries( $after, $this->origin ); + $result = $with_date_query->query( $args ); + + if ( \count( $result->post_ids() ) === $expected_count ) { + return $result; + } + } + + return $this->origin->query( $args ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-variable-post-queries.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-variable-post-queries.php new file mode 100644 index 00000000..827ff7f5 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-queries/class-variable-post-queries.php @@ -0,0 +1,51 @@ + $args The arguments to be used in the query. + * @return Post_Query + */ + public function query( array $args ): Post_Query { + return $this->final()->query( $args ); + } + + /** + * Post_Queries instance to use. + * + * @return Post_Queries + */ + private function final(): Post_Queries { + return $this->test->isValid( ( $this->input )() ) ? $this->is_true : $this->is_false; + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-global-post-query.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-global-post-query.php new file mode 100644 index 00000000..335139a0 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-global-post-query.php @@ -0,0 +1,61 @@ +global ] ) && $GLOBALS[ $this->global ] instanceof WP_Query + ? $GLOBALS[ $this->global ] + : $this->default; + } + + /** + * Found post objects. + * + * @return WP_Post[] + */ + public function post_objects(): array { + $query = new WP_Query_Envelope( $this->query_object() ); + + return $query->post_objects(); + } + + /** + * Found post IDs. + * + * @return int[] + */ + public function post_ids(): array { + $query = new WP_Query_Envelope( $this->query_object() ); + + return $query->post_ids(); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-post-ids-query.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-post-ids-query.php new file mode 100644 index 00000000..9e28dbc7 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-post-ids-query.php @@ -0,0 +1,70 @@ +posts = $this->post_ids(); + + // Fill in other properties to make it look more like an executed query. + $count = \count( $query->posts ); + $query->found_posts = $count; + $query->post_count = $count; + $query->max_num_pages = 1; + $query->set( 'fields', 'ids' ); + + return $query; + } + + /** + * Found post objects. + * + * @return WP_Post[] + */ + public function post_objects(): array { + $post_ids = $this->post_ids(); + + _prime_post_caches( $post_ids, false, false ); + + $posts = array_map( 'get_post', $post_ids ); + $posts = array_filter( $posts, fn ( $p ) => $p instanceof WP_Post ); + + return $posts; + } + + /** + * Found post IDs. + * + * @return int[] + */ + public function post_ids(): array { + return array_map( 'intval', $this->post_ids ); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-wp-query-envelope.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-wp-query-envelope.php new file mode 100644 index 00000000..8c043e61 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/post-query/class-wp-query-envelope.php @@ -0,0 +1,59 @@ +query; + } + + /** + * Found post objects. + * + * @return WP_Post[] + */ + public function post_objects(): array { + $posts = array_map( 'get_post', $this->post_ids() ); + $posts = array_filter( $posts, fn ( $p ) => $p instanceof WP_Post ); + + return $posts; + } + + /** + * Found post IDs. + * + * @return int[] + */ + public function post_ids(): array { + $ids = new WP_Query_Post_IDs( $this->query_object() ); + + return $ids->post_ids(); + } +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/types/interface-feature.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/types/interface-feature.php new file mode 100644 index 00000000..10f76cf1 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/types/interface-feature.php @@ -0,0 +1,18 @@ + $args Query arguments. + * @return Post_Query + */ + public function query( array $args ): Post_Query; +} diff --git a/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/types/interface-post-query.php b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/types/interface-post-query.php new file mode 100644 index 00000000..6e5c8138 --- /dev/null +++ b/vendor/alleyinteractive/wp-type-extensions/src/alley/wp/types/interface-post-query.php @@ -0,0 +1,30 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 00000000..51e734a7 --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 00000000..f27399a0 --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..0fb0a2c1 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 00000000..a71e65fe --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,17 @@ + $vendorDir . '/laminas/laminas-servicemanager/src/autoload.php', + '22177d82d05723dff5b1903f4496520e' => $vendorDir . '/alleyinteractive/wordpress-autoloader/src/class-autoloader.php', + 'd0b4d9ff2237dcc1a532ae9d039c0c2c' => $vendorDir . '/alleyinteractive/composer-wordpress-autoloader/src/autoload.php', + 'b4c1393590946316912f1825c4d559f0' => $vendorDir . '/alleyinteractive/wp-match-blocks/src/alley/wp/match-blocks.php', + '34b197430e01f74411146b5dd772055d' => $vendorDir . '/alleyinteractive/wp-match-blocks/src/alley/wp/internals/internals.php', + 'ed33d19cba977f2a7e321f120d94a872' => $vendorDir . '/spatie/once/src/functions.php', + '18ea4761fe239e693375d30a01936633' => $vendorDir . '/alleyinteractive/traverse-reshape/src/Alley/reshape.php', + '3e170268241fa56c275e43aec546ca42' => $vendorDir . '/alleyinteractive/traverse-reshape/src/Alley/traverse.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 00000000..15a2ff3a --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/spatie/once/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'Laminas\\Validator\\' => array($vendorDir . '/laminas/laminas-validator/src'), + 'Laminas\\Stdlib\\' => array($vendorDir . '/laminas/laminas-stdlib/src'), + 'Laminas\\ServiceManager\\' => array($vendorDir . '/laminas/laminas-servicemanager/src'), + 'ComposerWordPressAutoloader\\' => array($vendorDir . '/alleyinteractive/composer-wordpress-autoloader/src'), + 'Alley\\' => array($vendorDir . '/alleyinteractive/traverse-reshape/src/Alley', $vendorDir . '/alleyinteractive/laminas-validator-extensions/src/Alley'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 00000000..fc21626f --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ +register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInit1c9954415aecee54097cf0f5c17da765::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 00000000..59dbdbab --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,95 @@ + __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/autoload.php', + '22177d82d05723dff5b1903f4496520e' => __DIR__ . '/..' . '/alleyinteractive/wordpress-autoloader/src/class-autoloader.php', + 'd0b4d9ff2237dcc1a532ae9d039c0c2c' => __DIR__ . '/..' . '/alleyinteractive/composer-wordpress-autoloader/src/autoload.php', + 'b4c1393590946316912f1825c4d559f0' => __DIR__ . '/..' . '/alleyinteractive/wp-match-blocks/src/alley/wp/match-blocks.php', + '34b197430e01f74411146b5dd772055d' => __DIR__ . '/..' . '/alleyinteractive/wp-match-blocks/src/alley/wp/internals/internals.php', + 'ed33d19cba977f2a7e321f120d94a872' => __DIR__ . '/..' . '/spatie/once/src/functions.php', + '18ea4761fe239e693375d30a01936633' => __DIR__ . '/..' . '/alleyinteractive/traverse-reshape/src/Alley/reshape.php', + '3e170268241fa56c275e43aec546ca42' => __DIR__ . '/..' . '/alleyinteractive/traverse-reshape/src/Alley/traverse.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'S' => + array ( + 'Spatie\\Once\\' => 12, + ), + 'P' => + array ( + 'Psr\\Http\\Message\\' => 17, + 'Psr\\Container\\' => 14, + ), + 'L' => + array ( + 'Laminas\\Validator\\' => 18, + 'Laminas\\Stdlib\\' => 15, + 'Laminas\\ServiceManager\\' => 23, + ), + 'C' => + array ( + 'ComposerWordPressAutoloader\\' => 28, + ), + 'A' => + array ( + 'Alley\\' => 6, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Spatie\\Once\\' => + array ( + 0 => __DIR__ . '/..' . '/spatie/once/src', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + ), + 'Psr\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/container/src', + ), + 'Laminas\\Validator\\' => + array ( + 0 => __DIR__ . '/..' . '/laminas/laminas-validator/src', + ), + 'Laminas\\Stdlib\\' => + array ( + 0 => __DIR__ . '/..' . '/laminas/laminas-stdlib/src', + ), + 'Laminas\\ServiceManager\\' => + array ( + 0 => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src', + ), + 'ComposerWordPressAutoloader\\' => + array ( + 0 => __DIR__ . '/..' . '/alleyinteractive/composer-wordpress-autoloader/src', + ), + 'Alley\\' => + array ( + 0 => __DIR__ . '/..' . '/alleyinteractive/traverse-reshape/src/Alley', + 1 => __DIR__ . '/..' . '/alleyinteractive/laminas-validator-extensions/src/Alley', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit1c9954415aecee54097cf0f5c17da765::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit1c9954415aecee54097cf0f5c17da765::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit1c9954415aecee54097cf0f5c17da765::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 00000000..86af26ca --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,767 @@ +{ + "packages": [ + { + "name": "alleyinteractive/composer-wordpress-autoloader", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/alleyinteractive/composer-wordpress-autoloader.git", + "reference": "30acf9e3498a84af478e316ae3869fa362835695" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alleyinteractive/composer-wordpress-autoloader/zipball/30acf9e3498a84af478e316ae3869fa362835695", + "reference": "30acf9e3498a84af478e316ae3869fa362835695", + "shasum": "" + }, + "require": { + "alleyinteractive/wordpress-autoloader": "^1.1.1", + "composer-plugin-api": "^2.0", + "php": "^8.0" + }, + "require-dev": { + "composer/composer": "*", + "phpunit/phpunit": "^9.5.8", + "squizlabs/php_codesniffer": "^4.0" + }, + "time": "2023-12-06T20:21:22+00:00", + "type": "composer-plugin", + "extra": { + "class": "ComposerWordPressAutoloader\\Plugin" + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "ComposerWordPressAutoloader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alley Interactive", + "email": "info@alley.co" + }, + { + "name": "Sean Fisher", + "email": "sean@alley.co" + } + ], + "description": "Autoload files using WordPress File Conventions using Composer", + "support": { + "issues": "https://github.com/alleyinteractive/composer-wordpress-autoloader/issues", + "source": "https://github.com/alleyinteractive/composer-wordpress-autoloader/tree/v1.1.0" + }, + "install-path": "../alleyinteractive/composer-wordpress-autoloader" + }, + { + "name": "alleyinteractive/laminas-validator-extensions", + "version": "v2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/alleyinteractive/laminas-validator-extensions.git", + "reference": "09fd68d1fda5179d5e972cf7053edf4eab903313" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alleyinteractive/laminas-validator-extensions/zipball/09fd68d1fda5179d5e972cf7053edf4eab903313", + "reference": "09fd68d1fda5179d5e972cf7053edf4eab903313", + "shasum": "" + }, + "require": { + "laminas/laminas-validator": "^2.20", + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.8", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "time": "2024-02-14T17:54:59+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Alley\\": "src/Alley/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "description": "Additional validation classes for the laminas-validator framework.", + "support": { + "issues": "https://github.com/alleyinteractive/laminas-validator-extensions/issues", + "source": "https://github.com/alleyinteractive/laminas-validator-extensions/tree/v2.1.1" + }, + "install-path": "../alleyinteractive/laminas-validator-extensions" + }, + { + "name": "alleyinteractive/traverse-reshape", + "version": "v2.0.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/alleyinteractive/traverse-reshape.git", + "reference": "2b5bfd0723c0b9312ce6f7673f0e861fbe2d1567" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alleyinteractive/traverse-reshape/zipball/2b5bfd0723c0b9312ce6f7673f0e861fbe2d1567", + "reference": "2b5bfd0723c0b9312ce6f7673f0e861fbe2d1567", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.8", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "time": "2022-12-29T19:25:14+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/Alley/reshape.php", + "src/Alley/traverse.php" + ], + "psr-4": { + "Alley\\": "src/Alley/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "description": "Safely break down arrays or objects, and put them back together in new shapes.", + "support": { + "issues": "https://github.com/alleyinteractive/traverse-reshape/issues", + "source": "https://github.com/alleyinteractive/traverse-reshape/tree/v2.0.0" + }, + "install-path": "../alleyinteractive/traverse-reshape" + }, + { + "name": "alleyinteractive/wordpress-autoloader", + "version": "v1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/alleyinteractive/wordpress-autoloader.git", + "reference": "c7599d95f49f1cdc38fad19944a50b19ec0dd6ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alleyinteractive/wordpress-autoloader/zipball/c7599d95f49f1cdc38fad19944a50b19ec0dd6ca", + "reference": "c7599d95f49f1cdc38fad19944a50b19ec0dd6ca", + "shasum": "" + }, + "require": { + "php": "^7.4.0|^8.0|^8.1" + }, + "require-dev": { + "alleyinteractive/alley-coding-standards": "^0.3", + "phpunit/phpunit": "^9.5.8" + }, + "time": "2022-08-31T20:51:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/class-autoloader.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alley Interactive", + "email": "info@alley.co" + } + ], + "description": "Autoload files using WordPress File Conventions", + "support": { + "issues": "https://github.com/alleyinteractive/wordpress-autoloader/issues", + "source": "https://github.com/alleyinteractive/wordpress-autoloader/tree/v1.1.1" + }, + "install-path": "../alleyinteractive/wordpress-autoloader" + }, + { + "name": "alleyinteractive/wp-match-blocks", + "version": "v3.1.0", + "version_normalized": "3.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/alleyinteractive/wp-match-blocks.git", + "reference": "1fa48dc7059653df7ac46ec1fad05e36da236578" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alleyinteractive/wp-match-blocks/zipball/1fa48dc7059653df7ac46ec1fad05e36da236578", + "reference": "1fa48dc7059653df7ac46ec1fad05e36da236578", + "shasum": "" + }, + "require": { + "alleyinteractive/composer-wordpress-autoloader": "^1.0.0", + "alleyinteractive/laminas-validator-extensions": "^2.0.0", + "php": "^8.0" + }, + "require-dev": { + "alleyinteractive/alley-coding-standards": "^1.0.0", + "friendsofphp/php-cs-fixer": "^3.8", + "mantle-framework/testkit": "^0.9" + }, + "time": "2023-11-02T03:13:33+00:00", + "type": "library", + "extra": { + "wordpress-autoloader": { + "autoload": { + "Alley\\": "src/alley/" + }, + "autoload-dev": { + "Alley\\": "tests/alley/" + } + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/alley/wp/match-blocks.php", + "src/alley/wp/internals/internals.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "description": "Match WordPress blocks in the given content.", + "support": { + "issues": "https://github.com/alleyinteractive/wp-match-blocks/issues", + "source": "https://github.com/alleyinteractive/wp-match-blocks/tree/v3.1.0" + }, + "install-path": "../alleyinteractive/wp-match-blocks" + }, + { + "name": "alleyinteractive/wp-type-extensions", + "version": "v2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/alleyinteractive/wp-type-extensions.git", + "reference": "5a225b53fc8336193a6b2ed71e610d8c5b57d200" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alleyinteractive/wp-type-extensions/zipball/5a225b53fc8336193a6b2ed71e610d8c5b57d200", + "reference": "5a225b53fc8336193a6b2ed71e610d8c5b57d200", + "shasum": "" + }, + "require": { + "alleyinteractive/laminas-validator-extensions": "^2.0", + "alleyinteractive/wp-match-blocks": "^3.0", + "php": "^8.1", + "spatie/once": "^3.1" + }, + "require-dev": { + "alleyinteractive/alley-coding-standards": "^1.0.0", + "friendsofphp/php-cs-fixer": "^3.8", + "mantle-framework/testkit": "^0.9", + "szepeviktor/phpstan-wordpress": "^1.1" + }, + "time": "2024-05-29T02:13:50+00:00", + "type": "library", + "extra": { + "wordpress-autoloader": { + "autoload": { + "Alley\\": "src/alley/" + }, + "autoload-dev": { + "Alley\\": "tests/alley/" + } + } + }, + "installation-source": "dist", + "autoload-dev": { + "psr-4": { + "Alley\\": "tests/alley/" + } + }, + "scripts": { + "fixer": [ + "php-cs-fixer -v fix --allow-risky=yes" + ], + "phpcbf": [ + "phpcbf" + ], + "phpcs": [ + "phpcs" + ], + "phpstan": [ + "phpstan --memory-limit=512M" + ], + "phpunit": [ + "phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alley", + "email": "info@alley.com" + } + ], + "description": "PHP interfaces and implementations for WordPress.", + "support": { + "source": "https://github.com/alleyinteractive/wp-type-extensions/tree/v2.2.0", + "issues": "https://github.com/alleyinteractive/wp-type-extensions/issues" + }, + "install-path": "../alleyinteractive/wp-type-extensions" + }, + { + "name": "laminas/laminas-servicemanager", + "version": "3.22.1", + "version_normalized": "3.22.1.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-servicemanager.git", + "reference": "de98d297d4743956a0558a6d71616979ff779328" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/de98d297d4743956a0558a6d71616979ff779328", + "reference": "de98d297d4743956a0558a6d71616979ff779328", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^3.17", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/container": "^1.0" + }, + "conflict": { + "ext-psr": "*", + "laminas/laminas-code": "<4.10.0", + "zendframework/zend-code": "<3.3.1", + "zendframework/zend-servicemanager": "*" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "replace": { + "container-interop/container-interop": "^1.2.0" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11.99.5", + "friendsofphp/proxy-manager-lts": "^1.0.14", + "laminas/laminas-code": "^4.10.0", + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-container-config-test": "^0.8", + "mikey179/vfsstream": "^1.6.11", + "phpbench/phpbench": "^1.2.9", + "phpunit/phpunit": "^10.4", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.8.0" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "ProxyManager ^2.1.1 to handle lazy initialization of services" + }, + "time": "2023-10-24T11:19:47+00:00", + "bin": [ + "bin/generate-deps-for-config-factory", + "bin/generate-factory-for-class" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Factory-Driven Dependency Injection Container", + "homepage": "https://laminas.dev", + "keywords": [ + "PSR-11", + "dependency-injection", + "di", + "dic", + "laminas", + "service-manager", + "servicemanager" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-servicemanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-servicemanager/issues", + "rss": "https://github.com/laminas/laminas-servicemanager/releases.atom", + "source": "https://github.com/laminas/laminas-servicemanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "install-path": "../laminas/laminas-servicemanager" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.19.0", + "version_normalized": "3.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "6a192dd0882b514e45506f533b833b623b78fff3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/6a192dd0882b514e45506f533b833b623b78fff3", + "reference": "6a192dd0882b514e45506f533b833b623b78fff3", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "phpbench/phpbench": "^1.2.15", + "phpunit/phpunit": "^10.5.8", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.20.0" + }, + "time": "2024-01-19T12:39:49+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "install-path": "../laminas/laminas-stdlib" + }, + { + "name": "laminas/laminas-validator", + "version": "2.64.1", + "version_normalized": "2.64.1.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-validator.git", + "reference": "9db115056b666b7540c951b6d4477b8e0b52b9ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-validator/zipball/9db115056b666b7540c951b6d4477b8e0b52b9ad", + "reference": "9db115056b666b7540c951b6d4477b8e0b52b9ad", + "shasum": "" + }, + "require": { + "laminas/laminas-servicemanager": "^3.21.0", + "laminas/laminas-stdlib": "^3.19", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-message": "^1.0.1 || ^2.0.0" + }, + "conflict": { + "zendframework/zend-validator": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "laminas/laminas-db": "^2.20", + "laminas/laminas-filter": "^2.35.2", + "laminas/laminas-i18n": "^2.26.0", + "laminas/laminas-session": "^2.20", + "laminas/laminas-uri": "^2.11.0", + "phpunit/phpunit": "^10.5.20", + "psalm/plugin-phpunit": "^0.19.0", + "psr/http-client": "^1.0.3", + "psr/http-factory": "^1.1.0", + "vimeo/psalm": "^5.24.0" + }, + "suggest": { + "laminas/laminas-db": "Laminas\\Db component, required by the (No)RecordExists validator", + "laminas/laminas-filter": "Laminas\\Filter component, required by the Digits validator", + "laminas/laminas-i18n": "Laminas\\I18n component to allow translation of validation error messages", + "laminas/laminas-i18n-resources": "Translations of validator messages", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "laminas/laminas-session": "Laminas\\Session component, ^2.8; required by the Csrf validator", + "laminas/laminas-uri": "Laminas\\Uri component, required by the Uri and Sitemap\\Loc validators", + "psr/http-message": "psr/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators" + }, + "time": "2024-08-01T09:32:54+00:00", + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Validator", + "config-provider": "Laminas\\Validator\\ConfigProvider" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Laminas\\Validator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Validation classes for a wide range of domains, and the ability to chain validators to create complex validation criteria", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "validator" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-validator/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-validator/issues", + "rss": "https://github.com/laminas/laminas-validator/releases.atom", + "source": "https://github.com/laminas/laminas-validator" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "install-path": "../laminas/laminas-validator" + }, + { + "name": "psr/container", + "version": "1.1.2", + "version_normalized": "1.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "time": "2021-11-05T16:50:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "install-path": "../psr/container" + }, + { + "name": "psr/http-message", + "version": "2.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "time": "2023-04-04T09:54:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "install-path": "../psr/http-message" + }, + { + "name": "spatie/once", + "version": "3.1.1", + "version_normalized": "3.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/once.git", + "reference": "25252b821765d72566be17c52ea05b35329f0f8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/once/zipball/25252b821765d72566be17c52ea05b35329f0f8f", + "reference": "25252b821765d72566be17c52ea05b35329f0f8f", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.21", + "symfony/var-dumper": "^5.1" + }, + "time": "2024-05-27T09:17:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Spatie\\Once\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A magic memoization function", + "homepage": "https://github.com/spatie/once", + "keywords": [ + "cache", + "callable", + "memoization", + "once", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/once/tree/3.1.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "install-path": "../spatie/once" + } + ], + "dev": false, + "dev-package-names": [] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 00000000..37606e90 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,143 @@ + array( + 'name' => 'alleyinteractive/wp-curate', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, + 'type' => 'wordpress-plugin', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => false, + ), + 'versions' => array( + 'alleyinteractive/composer-wordpress-autoloader' => array( + 'pretty_version' => 'v1.1.0', + 'version' => '1.1.0.0', + 'reference' => '30acf9e3498a84af478e316ae3869fa362835695', + 'type' => 'composer-plugin', + 'install_path' => __DIR__ . '/../alleyinteractive/composer-wordpress-autoloader', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'alleyinteractive/laminas-validator-extensions' => array( + 'pretty_version' => 'v2.1.1', + 'version' => '2.1.1.0', + 'reference' => '09fd68d1fda5179d5e972cf7053edf4eab903313', + 'type' => 'library', + 'install_path' => __DIR__ . '/../alleyinteractive/laminas-validator-extensions', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'alleyinteractive/traverse-reshape' => array( + 'pretty_version' => 'v2.0.0', + 'version' => '2.0.0.0', + 'reference' => '2b5bfd0723c0b9312ce6f7673f0e861fbe2d1567', + 'type' => 'library', + 'install_path' => __DIR__ . '/../alleyinteractive/traverse-reshape', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'alleyinteractive/wordpress-autoloader' => array( + 'pretty_version' => 'v1.1.1', + 'version' => '1.1.1.0', + 'reference' => 'c7599d95f49f1cdc38fad19944a50b19ec0dd6ca', + 'type' => 'library', + 'install_path' => __DIR__ . '/../alleyinteractive/wordpress-autoloader', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'alleyinteractive/wp-curate' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, + 'type' => 'wordpress-plugin', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'alleyinteractive/wp-match-blocks' => array( + 'pretty_version' => 'v3.1.0', + 'version' => '3.1.0.0', + 'reference' => '1fa48dc7059653df7ac46ec1fad05e36da236578', + 'type' => 'library', + 'install_path' => __DIR__ . '/../alleyinteractive/wp-match-blocks', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'alleyinteractive/wp-type-extensions' => array( + 'pretty_version' => 'v2.2.0', + 'version' => '2.2.0.0', + 'reference' => '5a225b53fc8336193a6b2ed71e610d8c5b57d200', + 'type' => 'library', + 'install_path' => __DIR__ . '/../alleyinteractive/wp-type-extensions', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'container-interop/container-interop' => array( + 'dev_requirement' => false, + 'replaced' => array( + 0 => '^1.2.0', + ), + ), + 'laminas/laminas-servicemanager' => array( + 'pretty_version' => '3.22.1', + 'version' => '3.22.1.0', + 'reference' => 'de98d297d4743956a0558a6d71616979ff779328', + 'type' => 'library', + 'install_path' => __DIR__ . '/../laminas/laminas-servicemanager', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'laminas/laminas-stdlib' => array( + 'pretty_version' => '3.19.0', + 'version' => '3.19.0.0', + 'reference' => '6a192dd0882b514e45506f533b833b623b78fff3', + 'type' => 'library', + 'install_path' => __DIR__ . '/../laminas/laminas-stdlib', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'laminas/laminas-validator' => array( + 'pretty_version' => '2.64.1', + 'version' => '2.64.1.0', + 'reference' => '9db115056b666b7540c951b6d4477b8e0b52b9ad', + 'type' => 'library', + 'install_path' => __DIR__ . '/../laminas/laminas-validator', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/container' => array( + 'pretty_version' => '1.1.2', + 'version' => '1.1.2.0', + 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/container', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/container-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '^1.0', + ), + ), + 'psr/http-message' => array( + 'pretty_version' => '2.0', + 'version' => '2.0.0.0', + 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-message', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'spatie/once' => array( + 'pretty_version' => '3.1.1', + 'version' => '3.1.1.0', + 'reference' => '25252b821765d72566be17c52ea05b35329f0f8f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../spatie/once', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 00000000..4c3a5d68 --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 80100)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/vendor/laminas/laminas-servicemanager/COPYRIGHT.md b/vendor/laminas/laminas-servicemanager/COPYRIGHT.md new file mode 100644 index 00000000..0a8cccc0 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/COPYRIGHT.md @@ -0,0 +1 @@ +Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/) diff --git a/vendor/laminas/laminas-servicemanager/LICENSE.md b/vendor/laminas/laminas-servicemanager/LICENSE.md new file mode 100644 index 00000000..10b40f14 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/LICENSE.md @@ -0,0 +1,26 @@ +Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +- Neither the name of Laminas Foundation nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/laminas/laminas-servicemanager/README.md b/vendor/laminas/laminas-servicemanager/README.md new file mode 100644 index 00000000..862c83f0 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/README.md @@ -0,0 +1,40 @@ +# laminas-servicemanager + +[![Build Status](https://github.com/laminas/laminas-servicemanager/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/laminas/laminas-servicemanager/actions/workflows/continuous-integration.yml) +[![Psalm coverage](https://shepherd.dev/github/laminas/laminas-servicemanager/coverage.svg?)](https://shepherd.dev/github/laminas/laminas-servicemanager) + +> ## 🇷🇺 Русским гражданам +> +> Мы, участники Laminas, родились и живем в разных странах. У многих из нас есть друзья, родственники и коллеги как в России, так и в Украине. Некоторые из нас родились в России. Некоторые из нас живут в России. У некоторых бабушки и дедушки сражались с фашистами во Второй мировой войне. Здесь никто не поддерживает фашизм. +> +> У одного из нас есть украинская родственница, которая спаслась из дома вместе с сыном. Поезд задержался из-за бомбежки на дороге впереди. У нас есть друзья, которые прячутся в бомбоубежищах. Мы с тревогой ждем весточки от них после воздушных налетов, которые беспорядочно наносят удары и попадают по больницам, школам, детским садам и домам. Мы не берем это из каких-либо СМИ. Мы наблюдаем это напрямую. +> +> Вы доверяете нам достаточно, чтоб использовать наши программы, и мы просим вас довериться нам вновь. Мы нуждаемся в помощи. Выходите и протестуйте против этой бесполезной войны. Остановите кровопролитие. Скажите "Нет войне!" +> +> ## 🇺🇸 To Citizens of Russia +> +> We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism. +> +> One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences. +> +> You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!" + +The Service Locator design pattern is implemented by the `Laminas\ServiceManager` +component. The Service Locator is a service/object locator, tasked with +retrieving other objects. + +- File issues at https://github.com/laminas/laminas-servicemanager/issues +- [Online documentation](https://docs.laminas.dev/laminas-servicemanager) +- [Documentation source files](docs/book/) + +## Benchmarks + +We provide scripts for benchmarking laminas-servicemanager using the +[PHPBench](https://github.com/phpbench/phpbench) framework; these can be +found in the `benchmarks/` directory. + +To execute the benchmarks you can run the following command: + +```bash +$ vendor/bin/phpbench run --report=aggregate +``` diff --git a/vendor/laminas/laminas-servicemanager/composer.json b/vendor/laminas/laminas-servicemanager/composer.json new file mode 100644 index 00000000..996a777d --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/composer.json @@ -0,0 +1,98 @@ +{ + "name": "laminas/laminas-servicemanager", + "description": "Factory-Driven Dependency Injection Container", + "license": "BSD-3-Clause", + "keywords": [ + "laminas", + "di", + "dic", + "dependency-injection", + "psr-11", + "servicemanager", + "service-manager" + ], + "homepage": "https://laminas.dev", + "support": { + "issues": "https://github.com/laminas/laminas-servicemanager/issues", + "forum": "https://discourse.laminas.dev", + "chat": "https://laminas.dev/chat", + "source": "https://github.com/laminas/laminas-servicemanager", + "docs": "https://docs.laminas.dev/laminas-servicemanager/", + "rss": "https://github.com/laminas/laminas-servicemanager/releases.atom" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "laminas/laminas-stdlib": "^3.17", + "psr/container": "^1.0" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11.99.5", + "friendsofphp/proxy-manager-lts": "^1.0.14", + "laminas/laminas-code": "^4.10.0", + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-container-config-test": "^0.8", + "mikey179/vfsstream": "^1.6.11", + "phpbench/phpbench": "^1.2.9", + "phpunit/phpunit": "^10.4", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.8.0" + }, + "replace": { + "container-interop/container-interop": "^1.2.0" + }, + "conflict": { + "ext-psr": "*", + "laminas/laminas-code": "<4.10.0", + "zendframework/zend-code": "<3.3.1", + "zendframework/zend-servicemanager": "*" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "ProxyManager ^2.1.1 to handle lazy initialization of services" + }, + "autoload": { + "psr-4": { + "Laminas\\ServiceManager\\": "src/" + }, + "files": [ + "src/autoload.php" + ] + }, + "autoload-dev": { + "psr-4": { + "LaminasTest\\ServiceManager\\": "test/", + "LaminasBench\\ServiceManager\\": "benchmarks/" + }, + "files": [ + "test/autoload.php" + ] + }, + "bin": [ + "bin/generate-deps-for-config-factory", + "bin/generate-factory-for-class" + ], + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "composer/package-versions-deprecated": true + }, + "platform": { + "php": "8.1.99" + }, + "sort-packages": true + }, + "scripts": { + "benchmark": "phpbench run --revs=2 --iterations=2 --report=aggregate", + "check": [ + "@cs-check", + "@test" + ], + "cs-check": "phpcs", + "cs-fix": "phpcbf", + "static-analysis": "psalm --shepherd --stats", + "test": "phpunit --colors=always", + "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/AbstractFactory/ConfigAbstractFactory.php b/vendor/laminas/laminas-servicemanager/src/AbstractFactory/ConfigAbstractFactory.php new file mode 100644 index 00000000..3b58ad8f --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/AbstractFactory/ConfigAbstractFactory.php @@ -0,0 +1,78 @@ +has('config')) { + return false; + } + $config = $container->get('config'); + if (! isset($config[self::class])) { + return false; + } + $dependencies = $config[self::class]; + + return is_array($dependencies) && array_key_exists($requestedName, $dependencies); + } + + /** {@inheritDoc} */ + public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null) + { + if (! $container->has('config')) { + throw new ServiceNotCreatedException('Cannot find a config array in the container'); + } + + $config = $container->get('config'); + + if (! (is_array($config) || $config instanceof ArrayObject)) { + throw new ServiceNotCreatedException('Config must be an array or an instance of ArrayObject'); + } + if (! isset($config[self::class])) { + throw new ServiceNotCreatedException('Cannot find a `' . self::class . '` key in the config array'); + } + + $dependencies = $config[self::class]; + + if ( + ! is_array($dependencies) + || ! array_key_exists($requestedName, $dependencies) + || ! is_array($dependencies[$requestedName]) + ) { + throw new ServiceNotCreatedException('Service dependencies config must exist and be an array'); + } + + $serviceDependencies = $dependencies[$requestedName]; + + if ($serviceDependencies !== array_values(array_map('strval', $serviceDependencies))) { + $problem = json_encode(array_map('gettype', $serviceDependencies)); + throw new ServiceNotCreatedException( + 'Service dependencies config must be an array of strings, ' . $problem . ' given' + ); + } + + $arguments = array_map([$container, 'get'], $serviceDependencies); + + return new $requestedName(...$arguments); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/AbstractFactory/ReflectionBasedAbstractFactory.php b/vendor/laminas/laminas-servicemanager/src/AbstractFactory/ReflectionBasedAbstractFactory.php new file mode 100644 index 00000000..4f4654bd --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/AbstractFactory/ReflectionBasedAbstractFactory.php @@ -0,0 +1,245 @@ + + * 'service_manager' => [ + * 'abstract_factories' => [ + * ReflectionBasedAbstractFactory::class, + * ], + * ], + * + * + * Or as a factory, mapping a class name to it: + * + * + * 'service_manager' => [ + * 'factories' => [ + * MyClassWithDependencies::class => ReflectionBasedAbstractFactory::class, + * ], + * ], + * + * + * The latter approach is more explicit, and also more performant. + * + * The factory has the following constraints/features: + * + * - A parameter named `$config` typehinted as an array will receive the + * application "config" service (i.e., the merged configuration). + * - Parameters type-hinted against array, but not named `$config` will + * be injected with an empty array. + * - Scalar parameters will result in an exception being thrown, unless + * a default value is present; if the default is present, that will be used. + * - If a service cannot be found for a given typehint, the factory will + * raise an exception detailing this. + * - Some services provided by Laminas components do not have + * entries based on their class name (for historical reasons); the + * factory allows defining a map of these class/interface names to the + * corresponding service name to allow them to resolve. + * + * `$options` passed to the factory are ignored in all cases, as we cannot + * make assumptions about which argument(s) they might replace. + * + * Based on the LazyControllerAbstractFactory from laminas-mvc. + */ +class ReflectionBasedAbstractFactory implements AbstractFactoryInterface +{ + /** + * Maps known classes/interfaces to the service that provides them; only + * required for those services with no entry based on the class/interface + * name. + * + * Extend the class if you wish to add to the list. + * + * Example: + * + * + * [ + * \Laminas\Filter\FilterPluginManager::class => 'FilterManager', + * \Laminas\Validator\ValidatorPluginManager::class => 'ValidatorManager', + * ] + * + * + * @var string[] + */ + protected $aliases = []; + + /** + * Allows overriding the internal list of aliases. These should be of the + * form `class name => well-known service name`; see the documentation for + * the `$aliases` property for details on what is accepted. + * + * @param string[] $aliases + */ + public function __construct(array $aliases = []) + { + if (! empty($aliases)) { + $this->aliases = $aliases; + } + } + + /** + * {@inheritDoc} + * + * @return DispatchableInterface + */ + public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null) + { + $reflectionClass = new ReflectionClass($requestedName); + + if (null === ($constructor = $reflectionClass->getConstructor())) { + return new $requestedName(); + } + + $reflectionParameters = $constructor->getParameters(); + + if (empty($reflectionParameters)) { + return new $requestedName(); + } + + $resolver = $container->has('config') + ? $this->resolveParameterWithConfigService($container, $requestedName) + : $this->resolveParameterWithoutConfigService($container, $requestedName); + + $parameters = array_map($resolver, $reflectionParameters); + + return new $requestedName(...$parameters); + } + + /** {@inheritDoc} */ + public function canCreate(ContainerInterface $container, $requestedName) + { + return class_exists($requestedName) && $this->canCallConstructor($requestedName); + } + + private function canCallConstructor(string $requestedName): bool + { + $constructor = (new ReflectionClass($requestedName))->getConstructor(); + + return $constructor === null || $constructor->isPublic(); + } + + /** + * Resolve a parameter to a value. + * + * Returns a callback for resolving a parameter to a value, but without + * allowing mapping array `$config` arguments to the `config` service. + * + * @param string $requestedName + * @return callable + */ + private function resolveParameterWithoutConfigService(ContainerInterface $container, $requestedName) + { + /** + * @param ReflectionParameter $parameter + * @return mixed + * @throws ServiceNotFoundException If type-hinted parameter cannot be + * resolved to a service in the container. + * @psalm-suppress MissingClosureReturnType + */ + return fn(ReflectionParameter $parameter) => $this->resolveParameter($parameter, $container, $requestedName); + } + + /** + * Returns a callback for resolving a parameter to a value, including mapping 'config' arguments. + * + * Unlike resolveParameter(), this version will detect `$config` array + * arguments and have them return the 'config' service. + * + * @param string $requestedName + * @return callable + */ + private function resolveParameterWithConfigService(ContainerInterface $container, $requestedName) + { + /** + * @param ReflectionParameter $parameter + * @return mixed + * @throws ServiceNotFoundException If type-hinted parameter cannot be + * resolved to a service in the container. + */ + return function (ReflectionParameter $parameter) use ($container, $requestedName) { + if ($parameter->getName() === 'config') { + $type = $parameter->getType(); + if ($type instanceof ReflectionNamedType && $type->getName() === 'array') { + return $container->get('config'); + } + } + return $this->resolveParameter($parameter, $container, $requestedName); + }; + } + + /** + * Logic common to all parameter resolution. + * + * @param string $requestedName + * @return mixed + * @throws ServiceNotFoundException If type-hinted parameter cannot be + * resolved to a service in the container. + */ + private function resolveParameter(ReflectionParameter $parameter, ContainerInterface $container, $requestedName) + { + $type = $parameter->getType(); + $type = $type instanceof ReflectionNamedType ? $type->getName() : null; + + if ($type === 'array') { + return []; + } + + if ($type === null || (is_string($type) && ! class_exists($type) && ! interface_exists($type))) { + if (! $parameter->isDefaultValueAvailable()) { + throw new ServiceNotFoundException(sprintf( + 'Unable to create service "%s"; unable to resolve parameter "%s" ' + . 'to a class, interface, or array type', + $requestedName, + $parameter->getName() + )); + } + + return $parameter->getDefaultValue(); + } + + $type = $this->aliases[$type] ?? $type; + + if ($container->has($type)) { + return $container->get($type); + } + + if (! $parameter->isOptional()) { + throw new ServiceNotFoundException(sprintf( + 'Unable to create service "%s"; unable to resolve parameter "%s" using type hint "%s"', + $requestedName, + $parameter->getName(), + $type + )); + } + + // Type not available in container, but the value is optional and has a + // default defined. + return $parameter->getDefaultValue(); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/AbstractFactoryInterface.php b/vendor/laminas/laminas-servicemanager/src/AbstractFactoryInterface.php new file mode 100644 index 00000000..2a8ff71b --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/AbstractFactoryInterface.php @@ -0,0 +1,53 @@ + + * @psalm-import-type ServiceManagerConfiguration from ServiceManager + * @psalm-suppress PropertyNotSetInConstructor + */ +abstract class AbstractPluginManager extends ServiceManager implements PluginManagerInterface +{ + /** + * Whether or not to auto-add a FQCN as an invokable if it exists. + * + * @var bool + */ + protected $autoAddInvokableClass = true; + + /** + * An object type that the created instance must be instanced of + * + * @var null|string + * @psalm-var null|class-string + */ + protected $instanceOf; + + /** + * Sets the provided $parentLocator as the creation context for all + * factories; for $config, {@see \Laminas\ServiceManager\ServiceManager::configure()} + * for details on its accepted structure. + * + * @param null|ConfigInterface|ContainerInterface $configInstanceOrParentLocator + * @param array $config + * @psalm-param ServiceManagerConfiguration $config + */ + public function __construct($configInstanceOrParentLocator = null, array $config = []) + { + /** @psalm-suppress DocblockTypeContradiction */ + if ( + null !== $configInstanceOrParentLocator + && ! $configInstanceOrParentLocator instanceof ConfigInterface + && ! $configInstanceOrParentLocator instanceof ContainerInterface + ) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects a ConfigInterface or ContainerInterface instance as the first argument; received %s', + self::class, + is_object($configInstanceOrParentLocator) + ? $configInstanceOrParentLocator::class + : gettype($configInstanceOrParentLocator) + )); + } + + if ($configInstanceOrParentLocator instanceof ConfigInterface) { + trigger_error(sprintf( + 'Usage of %s as a constructor argument for %s is now deprecated', + ConfigInterface::class, + static::class + ), E_USER_DEPRECATED); + $config = $configInstanceOrParentLocator->toArray(); + } + + parent::__construct($config); + + if (! $configInstanceOrParentLocator instanceof ContainerInterface) { + trigger_error(sprintf( + '%s now expects a %s instance representing the parent container; please update your code', + __METHOD__, + ContainerInterface::class + ), E_USER_DEPRECATED); + } + + $this->creationContext = $configInstanceOrParentLocator instanceof ContainerInterface + ? $configInstanceOrParentLocator + : $this; + } + + /** + * Override configure() to validate service instances. + * + * @param array $config + * @psalm-param ServiceManagerConfiguration $config + * @return self + * @throws InvalidServiceException If an instance passed in the `services` configuration is invalid for the + * plugin manager. + * @throws ContainerModificationsNotAllowedException If the allow override flag has been toggled off, and a + * service instanceexists for a given service. + */ + public function configure(array $config) + { + if (isset($config['services'])) { + foreach ($config['services'] as $service) { + $this->validate($service); + } + } + + parent::configure($config); + + return $this; + } + + /** + * Override setService for additional plugin validation. + * + * {@inheritDoc} + * + * @param string|class-string $name + * @param InstanceType $service + */ + public function setService($name, $service) + { + $this->validate($service); + parent::setService($name, $service); + } + + /** + * @param class-string|string $name Service name of plugin to retrieve. + * @param null|array $options Options to use when creating the instance. + * @return mixed + * @psalm-return ($name is class-string ? InstanceType : mixed) + * @throws Exception\ServiceNotFoundException If the manager does not have + * a service definition for the instance, and the service is not + * auto-invokable. + * @throws InvalidServiceException If the plugin created is invalid for the + * plugin context. + */ + public function get($name, ?array $options = null) + { + if (! $this->has($name)) { + if (! $this->autoAddInvokableClass || ! class_exists($name)) { + throw new Exception\ServiceNotFoundException(sprintf( + 'A plugin by the name "%s" was not found in the plugin manager %s', + $name, + static::class + )); + } + + $this->setFactory($name, Factory\InvokableFactory::class); + } + + $instance = ! $options ? parent::get($name) : $this->build($name, $options); + $this->validate($instance); + return $instance; + } + + /** + * {@inheritDoc} + * + * @psalm-assert InstanceType $instance + */ + public function validate(mixed $instance) + { + if (method_exists($this, 'validatePlugin')) { + trigger_error(sprintf( + '%s::validatePlugin() has been deprecated as of 3.0; please define validate() instead', + static::class + ), E_USER_DEPRECATED); + $this->validatePlugin($instance); + return; + } + + if (empty($this->instanceOf) || $instance instanceof $this->instanceOf) { + return; + } + + throw new InvalidServiceException(sprintf( + 'Plugin manager "%s" expected an instance of type "%s", but "%s" was received', + self::class, + $this->instanceOf, + is_object($instance) ? $instance::class : gettype($instance) + )); + } + + /** + * Implemented for backwards compatibility only. + * + * Returns the creation context. + * + * @deprecated since 3.0.0. The creation context should be passed during + * instantiation instead. + * + * @return void + */ + public function setServiceLocator(ContainerInterface $container) + { + trigger_error(sprintf( + 'Usage of %s is deprecated since v3.0.0; please pass the container to the constructor instead', + __METHOD__ + ), E_USER_DEPRECATED); + $this->creationContext = $container; + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/Config.php b/vendor/laminas/laminas-servicemanager/src/Config.php new file mode 100644 index 00000000..b7b6042c --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Config.php @@ -0,0 +1,102 @@ + */ + private array $allowedKeys = [ + 'abstract_factories' => true, + 'aliases' => true, + 'delegators' => true, + 'factories' => true, + 'initializers' => true, + 'invokables' => true, + 'lazy_services' => true, + 'services' => true, + 'shared' => true, + ]; + + /** + * @var array + * @psalm-var ServiceManagerConfigurationType + */ + protected $config = [ + 'abstract_factories' => [], + 'aliases' => [], + 'delegators' => [], + 'factories' => [], + 'initializers' => [], + 'invokables' => [], + 'lazy_services' => [], + 'services' => [], + 'shared' => [], + ]; + + /** + * @psalm-param ServiceManagerConfigurationType $config + */ + public function __construct(array $config = []) + { + // Only merge keys we're interested in + foreach (array_keys($config) as $key) { + if (! isset($this->allowedKeys[$key])) { + unset($config[$key]); + } + } + + /** @psalm-suppress ArgumentTypeCoercion */ + $this->config = $this->merge($this->config, $config); + } + + /** + * @inheritDoc + */ + public function configureServiceManager(ServiceManager $serviceManager) + { + return $serviceManager->configure($this->config); + } + + /** + * @inheritDoc + */ + public function toArray() + { + return $this->config; + } + + /** + * @psalm-param ServiceManagerConfigurationType $a + * @psalm-param ServiceManagerConfigurationType $b + * @psalm-return ServiceManagerConfigurationType + */ + private function merge(array $a, array $b) + { + return ArrayUtils::merge($a, $b); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/ConfigInterface.php b/vendor/laminas/laminas-servicemanager/src/ConfigInterface.php new file mode 100644 index 00000000..15fb7e3e --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/ConfigInterface.php @@ -0,0 +1,93 @@ +|Factory\AbstractFactoryInterface) + * > + * @psalm-type DelegatorsConfigurationType = array< + * string, + * array< + * array-key, + * (class-string|Factory\DelegatorFactoryInterface) + * |callable(ContainerInterface,string,callable():object,array|null):object + * > + * > + * @psalm-type FactoriesConfigurationType = array< + * string, + * (class-string|Factory\FactoryInterface) + * |callable(ContainerInterface,?string,?array|null):object + * > + * @psalm-type InitializersConfigurationType = array< + * array-key, + * (class-string|Initializer\InitializerInterface) + * |callable(ContainerInterface,object):void + * > + * @psalm-type LazyServicesConfigurationType = array{ + * class_map?:array, + * proxies_namespace?:non-empty-string, + * proxies_target_dir?:non-empty-string, + * write_proxy_files?:bool + * } + * @psalm-type ServiceManagerConfigurationType = array{ + * abstract_factories?: AbstractFactoriesConfigurationType, + * aliases?: array, + * delegators?: DelegatorsConfigurationType, + * factories?: FactoriesConfigurationType, + * initializers?: InitializersConfigurationType, + * invokables?: array, + * lazy_services?: LazyServicesConfigurationType, + * services?: array, + * shared?:array, + * ... + * } + */ +interface ConfigInterface +{ + /** + * Configure a service manager. + * + * Implementations should pull configuration from somewhere (typically + * local properties) and pass it to a ServiceManager's withConfig() method, + * returning a new instance. + * + * @return ServiceManager + */ + public function configureServiceManager(ServiceManager $serviceManager); + + /** + * Return configuration for a service manager instance as an array. + * + * Implementations MUST return an array compatible with ServiceManager::configure, + * containing one or more of the following keys: + * + * - abstract_factories + * - aliases + * - delegators + * - factories + * - initializers + * - invokables + * - lazy_services + * - services + * - shared + * + * In other words, this should return configuration that can be used to instantiate + * a service manager or plugin manager, or pass to its `withConfig()` method. + * + * @return array + * @psalm-return ServiceManagerConfigurationType + */ + public function toArray(); +} diff --git a/vendor/laminas/laminas-servicemanager/src/DelegatorFactoryInterface.php b/vendor/laminas/laminas-servicemanager/src/DelegatorFactoryInterface.php new file mode 100644 index 00000000..1b30ecf6 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/DelegatorFactoryInterface.php @@ -0,0 +1,41 @@ + ' . $cursor; + } + $cycle .= ' -> ' . $alias . "\n"; + + return new self(sprintf( + "A cycle was detected within the aliases definitions:\n%s", + $cycle + )); + } + + /** + * @param string[] $aliases map of referenced services, indexed by alias name (string) + * @return self + */ + public static function fromAliasesMap(array $aliases) + { + $detectedCycles = array_filter(array_map( + static fn($alias): ?array => self::getCycleFor($aliases, $alias), + array_keys($aliases) + )); + + if (! $detectedCycles) { + return new self(sprintf( + "A cycle was detected within the following aliases map:\n\n%s", + self::printReferencesMap($aliases) + )); + } + + return new self(sprintf( + "Cycles were detected within the provided aliases:\n\n%s\n\n" + . "The cycle was detected in the following alias map:\n\n%s", + self::printCycles(self::deDuplicateDetectedCycles($detectedCycles)), + self::printReferencesMap($aliases) + )); + } + + /** + * Retrieves the cycle detected for the given $alias, or `null` if no cycle was detected + * + * @param string[] $aliases + * @param string $alias + * @return array|null + */ + private static function getCycleFor(array $aliases, $alias) + { + $cycleCandidate = []; + $targetName = $alias; + + while (isset($aliases[$targetName])) { + if (isset($cycleCandidate[$targetName])) { + return $cycleCandidate; + } + + $cycleCandidate[$targetName] = true; + $targetName = $aliases[$targetName]; + } + + return null; + } + + /** + * @param string[] $aliases + * @return string + */ + private static function printReferencesMap(array $aliases) + { + $map = []; + + foreach ($aliases as $alias => $reference) { + $map[] = '"' . $alias . '" => "' . $reference . '"'; + } + + return "[\n" . implode("\n", $map) . "\n]"; + } + + /** + * @param string[][] $detectedCycles + * @return string + */ + private static function printCycles(array $detectedCycles) + { + return "[\n" . implode("\n", array_map([self::class, 'printCycle'], $detectedCycles)) . "\n]"; + } + + /** + * @param string[] $detectedCycle + * @return string + * @phpcsSuppress SlevomatCodingStandard.Classes.UnusedPrivateElements.UnusedMethod + */ + private static function printCycle(array $detectedCycle) + { + $fullCycle = array_keys($detectedCycle); + $fullCycle[] = reset($fullCycle); + + return implode( + ' => ', + array_map( + static fn($cycle): string => '"' . $cycle . '"', + $fullCycle + ) + ); + } + + /** + * @param bool[][] $detectedCycles + * @return bool[][] de-duplicated + */ + private static function deDuplicateDetectedCycles(array $detectedCycles) + { + $detectedCyclesByHash = []; + + foreach ($detectedCycles as $detectedCycle) { + $cycleAliases = array_keys($detectedCycle); + + sort($cycleAliases); + + $hash = serialize($cycleAliases); + + $detectedCyclesByHash[$hash] ??= $detectedCycle; + } + + return array_values($detectedCyclesByHash); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/Exception/ExceptionInterface.php b/vendor/laminas/laminas-servicemanager/src/Exception/ExceptionInterface.php new file mode 100644 index 00000000..cccc42df --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Exception/ExceptionInterface.php @@ -0,0 +1,14 @@ + $options + * @return object + * @throws ServiceNotFoundException If unable to resolve the service. + * @throws ServiceNotCreatedException If an exception is raised when creating a service. + * @throws ContainerExceptionInterface If any other error occurs. + */ + public function __invoke(ContainerInterface $container, $name, callable $callback, ?array $options = null); +} diff --git a/vendor/laminas/laminas-servicemanager/src/Factory/FactoryInterface.php b/vendor/laminas/laminas-servicemanager/src/Factory/FactoryInterface.php new file mode 100644 index 00000000..68e61671 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Factory/FactoryInterface.php @@ -0,0 +1,33 @@ + $options + * @return object + * @throws ServiceNotFoundException If unable to resolve the service. + * @throws ServiceNotCreatedException If an exception is raised when creating a service. + * @throws ContainerExceptionInterface If any other error occurs. + */ + public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null); +} diff --git a/vendor/laminas/laminas-servicemanager/src/Factory/InvokableFactory.php b/vendor/laminas/laminas-servicemanager/src/Factory/InvokableFactory.php new file mode 100644 index 00000000..6f80c894 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Factory/InvokableFactory.php @@ -0,0 +1,27 @@ + $servicesMap A map of service names to + * class names of their respective classes + */ + public function __construct(private LazyLoadingValueHolderFactory $proxyFactory, private array $servicesMap) + { + } + + /** + * {@inheritDoc} + * + * @param string $name + * @return VirtualProxyInterface + */ + public function __invoke(ContainerInterface $container, $name, callable $callback, ?array $options = null) + { + if (isset($this->servicesMap[$name])) { + $initializer = static function (&$wrappedInstance, LazyLoadingInterface $proxy) use ($callback): bool { + $proxy->setProxyInitializer(null); + $wrappedInstance = $callback(); + + return true; + }; + + return $this->proxyFactory->createProxy($this->servicesMap[$name], $initializer); + } + + throw new Exception\ServiceNotFoundException( + sprintf('The requested service "%s" was not found in the provided services map', $name) + ); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/ServiceLocatorInterface.php b/vendor/laminas/laminas-servicemanager/src/ServiceLocatorInterface.php new file mode 100644 index 00000000..3d4bd447 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/ServiceLocatorInterface.php @@ -0,0 +1,30 @@ + $name + * @param null|array $options + * @return mixed + * @psalm-return ($name is class-string ? T : mixed) + * @throws Exception\ServiceNotFoundException If no factory/abstract + * factory could be found to create the instance. + * @throws Exception\ServiceNotCreatedException If factory/delegator fails + * to create the instance. + * @throws ContainerExceptionInterface If any other error occurs. + */ + public function build($name, ?array $options = null); +} diff --git a/vendor/laminas/laminas-servicemanager/src/ServiceManager.php b/vendor/laminas/laminas-servicemanager/src/ServiceManager.php new file mode 100644 index 00000000..d63e2631 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/ServiceManager.php @@ -0,0 +1,1010 @@ +|Factory\AbstractFactoryInterface) + * > + * @psalm-type DelegatorsConfiguration = array< + * string, + * array< + * array-key, + * (class-string|Factory\DelegatorFactoryInterface) + * |callable(ContainerInterface,string,callable():object,array|null):object + * > + * > + * @psalm-type FactoriesConfiguration = array< + * string, + * (class-string|Factory\FactoryInterface) + * |callable(ContainerInterface,?string,?array|null):object + * > + * @psalm-type InitializersConfiguration = array< + * array-key, + * (class-string|Initializer\InitializerInterface) + * |callable(ContainerInterface,object):void + * > + * @psalm-type LazyServicesConfiguration = array{ + * class_map?:array, + * proxies_namespace?:non-empty-string, + * proxies_target_dir?:non-empty-string, + * write_proxy_files?:bool + * } + * @psalm-type ServiceManagerConfiguration = array{ + * abstract_factories?: AbstractFactoriesConfiguration, + * aliases?: array, + * delegators?: DelegatorsConfiguration, + * factories?: FactoriesConfiguration, + * initializers?: InitializersConfiguration, + * invokables?: array, + * lazy_services?: LazyServicesConfiguration, + * services?: array>, + * shared?:array, + * shared_by_default?:bool, + * ... + * } + */ +class ServiceManager implements ServiceLocatorInterface +{ + /** @var Factory\AbstractFactoryInterface[] */ + protected $abstractFactories = []; + + /** + * A list of aliases + * + * Should map one alias to a service name, or another alias (aliases are recursively resolved) + * + * @var string[] + */ + protected $aliases = []; + + /** + * Whether or not changes may be made to this instance. + * + * @var bool + */ + protected $allowOverride = false; + + /** @var ContainerInterface */ + protected $creationContext; + + /** + * @var string[][]|Factory\DelegatorFactoryInterface[][] + * @psalm-var DelegatorsConfiguration + */ + protected $delegators = []; + + /** + * A list of factories (either as string name or callable) + * + * @var string[]|callable[] + * @psalm-var FactoriesConfiguration + */ + protected $factories = []; + + /** + * @var Initializer\InitializerInterface[]|callable[] + * @psalm-var InitializersConfiguration + */ + protected $initializers = []; + + /** + * @var array + * @psalm-var LazyServicesConfiguration + */ + protected $lazyServices = []; + + private ?LazyServiceFactory $lazyServicesDelegator = null; + + /** + * A list of already loaded services (this act as a local cache) + * + * @var array + */ + protected $services = []; + + /** + * Enable/disable shared instances by service name. + * + * Example configuration: + * + * 'shared' => [ + * MyService::class => true, // will be shared, even if "sharedByDefault" is false + * MyOtherService::class => false // won't be shared, even if "sharedByDefault" is true + * ] + * + * @var array + */ + protected $shared = []; + + /** + * Should the services be shared by default? + * + * @var bool + */ + protected $sharedByDefault = true; + + /** + * Service manager was already configured? + * + * @var bool + */ + protected $configured = false; + + /** + * Cached abstract factories from string. + */ + private array $cachedAbstractFactories = []; + + /** + * See {@see \Laminas\ServiceManager\ServiceManager::configure()} for details + * on what $config accepts. + * + * @psalm-param ServiceManagerConfiguration $config + */ + public function __construct(array $config = []) + { + $this->creationContext = $this; + $this->configure($config); + } + + /** + * Implemented for backwards compatibility with previous plugin managers only. + * + * Returns the creation context. + * + * @deprecated since 3.0.0. Factories using 3.0 should use the container + * instance passed to the factory instead. + * + * @return ContainerInterface + */ + public function getServiceLocator() + { + trigger_error(sprintf( + 'Usage of %s is deprecated since v3.0.0; please use the container passed to the factory instead', + __METHOD__ + ), E_USER_DEPRECATED); + return $this->creationContext; + } + + /** {@inheritDoc} */ + public function get($name) + { + // We start by checking if we have cached the requested service; + // this is the fastest method. + if (isset($this->services[$name])) { + return $this->services[$name]; + } + + // Determine if the service should be shared. + $sharedService = $this->shared[$name] ?? $this->sharedByDefault; + + // We achieve better performance if we can let all alias + // considerations out. + if (! $this->aliases) { + $object = $this->doCreate($name); + + // Cache the object for later, if it is supposed to be shared. + if ($sharedService) { + $this->services[$name] = $object; + } + return $object; + } + + // We now deal with requests which may be aliases. + $resolvedName = $this->aliases[$name] ?? $name; + + // Update shared service information as we checked if the alias was shared before. + if ($resolvedName !== $name) { + $sharedService = $this->shared[$resolvedName] ?? $sharedService; + } + + // The following is only true if the requested service is a shared alias. + $sharedAlias = $sharedService && isset($this->services[$resolvedName]); + + // If the alias is configured as a shared service, we are done. + if ($sharedAlias) { + $this->services[$name] = $this->services[$resolvedName]; + return $this->services[$resolvedName]; + } + + // At this point, we have to create the object. + // We use the resolved name for that. + $object = $this->doCreate($resolvedName); + + // Cache the object for later, if it is supposed to be shared. + if ($sharedService) { + $this->services[$resolvedName] = $object; + } + + // Also cache under the alias name; this allows sharing based on the + // service name used. + if ($sharedAlias) { + $this->services[$name] = $object; + } + + return $object; + } + + /** {@inheritDoc} */ + public function build($name, ?array $options = null) + { + // We never cache when using "build". + $name = $this->aliases[$name] ?? $name; + return $this->doCreate($name, $options); + } + + /** + * {@inheritDoc} + * + * @param string|class-string $name + * @return bool + */ + public function has($name) + { + // Check static services and factories first to speedup the most common requests. + return $this->staticServiceOrFactoryCanCreate($name) || $this->abstractFactoryCanCreate($name); + } + + /** + * Indicate whether or not the instance is immutable. + * + * @param bool $flag + */ + public function setAllowOverride($flag) + { + $this->allowOverride = (bool) $flag; + } + + /** + * Retrieve the flag indicating immutability status. + * + * @return bool + */ + public function getAllowOverride() + { + return $this->allowOverride; + } + + /** + * @psalm-param ServiceManagerConfiguration $config + * @return self + * @throws ContainerModificationsNotAllowedException If the allow + * override flag has been toggled off, and a service instance + * exists for a given service. + */ + public function configure(array $config) + { + // This is a bulk update/initial configuration, + // so we check all definitions up front. + $this->validateServiceNames($config); + + if (isset($config['services'])) { + $this->services = $config['services'] + $this->services; + } + + if (isset($config['invokables']) && ! empty($config['invokables'])) { + $newAliases = $this->createAliasesAndFactoriesForInvokables($config['invokables']); + // override existing aliases with those created by invokables to ensure + // that they are still present after merging aliases later on + $config['aliases'] = $newAliases + ($config['aliases'] ?? []); + } + + if (isset($config['factories'])) { + $this->factories = $config['factories'] + $this->factories; + } + + if (isset($config['delegators'])) { + $this->mergeDelegators($config['delegators']); + } + + if (isset($config['shared'])) { + $this->shared = $config['shared'] + $this->shared; + } + + if (! empty($config['aliases'])) { + $this->aliases = $config['aliases'] + $this->aliases; + $this->mapAliasesToTargets(); + } elseif (! $this->configured && ! empty($this->aliases)) { + $this->mapAliasesToTargets(); + } + + if (isset($config['shared_by_default'])) { + $this->sharedByDefault = $config['shared_by_default']; + } + + // If lazy service configuration was provided, reset the lazy services + // delegator factory. + if (isset($config['lazy_services']) && ! empty($config['lazy_services'])) { + /** @psalm-suppress MixedPropertyTypeCoercion */ + $this->lazyServices = ArrayUtils::merge($this->lazyServices, $config['lazy_services']); + $this->lazyServicesDelegator = null; + } + + // For abstract factories and initializers, we always directly + // instantiate them to avoid checks during service construction. + if (isset($config['abstract_factories'])) { + $abstractFactories = $config['abstract_factories']; + // $key not needed, but foreach is faster than foreach + array_values. + foreach ($abstractFactories as $key => $abstractFactory) { + $this->resolveAbstractFactoryInstance($abstractFactory); + } + } + + if (isset($config['initializers'])) { + $this->resolveInitializers($config['initializers']); + } + + $this->configured = true; + + return $this; + } + + /** + * Add an alias. + * + * @param string $alias + * @param string $target + * @throws ContainerModificationsNotAllowedException If $alias already + * exists as a service and overrides are disallowed. + */ + public function setAlias($alias, $target) + { + if (isset($this->services[$alias]) && ! $this->allowOverride) { + throw ContainerModificationsNotAllowedException::fromExistingService($alias); + } + + $this->mapAliasToTarget($alias, $target); + } + + /** + * Add an invokable class mapping. + * + * @param string $name Service name + * @param null|string $class Class to which to map; if omitted, $name is + * assumed. + * @throws ContainerModificationsNotAllowedException If $name already + * exists as a service and overrides are disallowed. + */ + public function setInvokableClass($name, $class = null) + { + if (isset($this->services[$name]) && ! $this->allowOverride) { + throw ContainerModificationsNotAllowedException::fromExistingService($name); + } + + $this->createAliasesAndFactoriesForInvokables([$name => $class ?? $name]); + } + + /** + * Specify a factory for a given service name. + * + * @param string $name Service name + * @param string|callable|Factory\FactoryInterface $factory Factory to which to map. + * phpcs:disable Generic.Files.LineLength.TooLong + * @psalm-param class-string|callable(ContainerInterface,string,array|null):object|Factory\FactoryInterface $factory + * phpcs:enable Generic.Files.LineLength.TooLong + * @return void + * @throws ContainerModificationsNotAllowedException If $name already + * exists as a service and overrides are disallowed. + */ + public function setFactory($name, $factory) + { + if (isset($this->services[$name]) && ! $this->allowOverride) { + throw ContainerModificationsNotAllowedException::fromExistingService($name); + } + + $this->factories[$name] = $factory; + } + + /** + * Create a lazy service mapping to a class. + * + * @param string $name Service name to map + * @param null|string $class Class to which to map; if not provided, $name + * will be used for the mapping. + */ + public function mapLazyService($name, $class = null) + { + $this->configure(['lazy_services' => ['class_map' => [$name => $class ?: $name]]]); + } + + /** + * Add an abstract factory for resolving services. + * + * @param string|Factory\AbstractFactoryInterface $factory Abstract factory + * instance or class name. + * @psalm-param class-string|Factory\AbstractFactoryInterface $factory + */ + public function addAbstractFactory($factory) + { + $this->resolveAbstractFactoryInstance($factory); + } + + /** + * Add a delegator for a given service. + * + * @param string $name Service name + * @param string|callable|Factory\DelegatorFactoryInterface $factory Delegator + * factory to assign. + * @psalm-param class-string + * |callable(ContainerInterface,string,callable,array|null) $factory + */ + public function addDelegator($name, $factory) + { + $this->configure(['delegators' => [$name => [$factory]]]); + } + + /** + * Add an initializer. + * + * @param string|callable|Initializer\InitializerInterface $initializer + * @psalm-param class-string + * |callable(ContainerInterface,mixed):void + * |Initializer\InitializerInterface $initializer + */ + public function addInitializer($initializer) + { + $this->configure(['initializers' => [$initializer]]); + } + + /** + * Map a service. + * + * @param string $name Service name + * @param array|object $service + * @throws ContainerModificationsNotAllowedException If $name already + * exists as a service and overrides are disallowed. + */ + public function setService($name, $service) + { + if (isset($this->services[$name]) && ! $this->allowOverride) { + throw ContainerModificationsNotAllowedException::fromExistingService($name); + } + $this->services[$name] = $service; + } + + /** + * Add a service sharing rule. + * + * @param string $name Service name + * @param bool $flag Whether or not the service should be shared. + * @throws ContainerModificationsNotAllowedException If $name already + * exists as a service and overrides are disallowed. + */ + public function setShared($name, $flag) + { + if (isset($this->services[$name]) && ! $this->allowOverride) { + throw ContainerModificationsNotAllowedException::fromExistingService($name); + } + + $this->shared[$name] = (bool) $flag; + } + + /** + * Instantiate initializers for to avoid checks during service construction. + * + * @psalm-param InitializersConfiguration $initializers + */ + private function resolveInitializers(array $initializers): void + { + foreach ($initializers as $initializer) { + if (is_string($initializer) && class_exists($initializer)) { + $initializer = new $initializer(); + } + + if (is_callable($initializer)) { + $this->initializers[] = $initializer; + continue; + } + + throw InvalidArgumentException::fromInvalidInitializer($initializer); + } + } + + /** + * Get a factory for the given service name + * + * @psalm-return (callable(ContainerInterface,string,array|null):object)|Factory\FactoryInterface + * @throws ServiceNotFoundException + */ + private function getFactory(string $name): callable + { + $factory = $this->factories[$name] ?? null; + + $lazyLoaded = false; + if (is_string($factory) && class_exists($factory)) { + $factory = new $factory(); + $lazyLoaded = true; + } + + if (is_callable($factory)) { + if ($lazyLoaded) { + $this->factories[$name] = $factory; + } + + return $factory; + } + + // Check abstract factories + foreach ($this->abstractFactories as $abstractFactory) { + if ($abstractFactory->canCreate($this->creationContext, $name)) { + return $abstractFactory; + } + } + + throw new ServiceNotFoundException(sprintf( + 'Unable to resolve service "%s" to a factory; are you certain you provided it during configuration?', + $name + )); + } + + /** + * @return object + */ + private function createDelegatorFromName(string $name, ?array $options = null) + { + $creationCallback = function () use ($name, $options) { + // Code is inlined for performance reason, instead of abstracting the creation + $factory = $this->getFactory($name); + return $factory($this->creationContext, $name, $options); + }; + + $initialCreationContext = $this->creationContext; + + foreach ($this->delegators[$name] as $index => $delegatorFactory) { + $delegatorFactory = $this->delegators[$name][$index]; + + if ($delegatorFactory === LazyServiceFactory::class) { + $delegatorFactory = $this->createLazyServiceDelegatorFactory(); + } elseif (is_string($delegatorFactory) && class_exists($delegatorFactory)) { + $delegatorFactory = new $delegatorFactory(); + } + + $this->assertCallableDelegatorFactory($delegatorFactory); + + $this->delegators[$name][$index] = $delegatorFactory; + + $creationCallback = + /** @return object */ + static fn() => $delegatorFactory($initialCreationContext, $name, $creationCallback, $options); + } + + return $creationCallback(); + } + + /** + * Create a new instance with an already resolved name + * + * This is a highly performance sensitive method, do not modify if you have not benchmarked it carefully + * + * @return object + * @throws ServiceNotFoundException If unable to resolve the service. + * @throws ServiceNotCreatedException If an exception is raised when creating a service. + * @throws ContainerExceptionInterface If any other error occurs. + */ + private function doCreate(string $resolvedName, ?array $options = null) + { + try { + if (! isset($this->delegators[$resolvedName])) { + // Let's create the service by fetching the factory + $factory = $this->getFactory($resolvedName); + $object = $factory($this->creationContext, $resolvedName, $options); + } else { + $object = $this->createDelegatorFromName($resolvedName, $options); + } + } catch (ContainerExceptionInterface $exception) { + throw $exception; + } catch (Exception $exception) { + throw new ServiceNotCreatedException(sprintf( + 'Service with name "%s" could not be created. Reason: %s', + $resolvedName, + $exception->getMessage() + ), (int) $exception->getCode(), $exception); + } + + foreach ($this->initializers as $initializer) { + $initializer($this->creationContext, $object); + } + + return $object; + } + + /** + * Create the lazy services delegator factory. + * + * Creates the lazy services delegator factory based on the lazy_services + * configuration present. + * + * @throws ServiceNotCreatedException When the lazy service class_map configuration is missing. + */ + private function createLazyServiceDelegatorFactory(): LazyServiceFactory + { + if ($this->lazyServicesDelegator) { + return $this->lazyServicesDelegator; + } + + if (! isset($this->lazyServices['class_map'])) { + throw new ServiceNotCreatedException('Missing "class_map" config key in "lazy_services"'); + } + + $factoryConfig = new ProxyConfiguration(); + + if (isset($this->lazyServices['proxies_namespace'])) { + $factoryConfig->setProxiesNamespace($this->lazyServices['proxies_namespace']); + } + + if (isset($this->lazyServices['proxies_target_dir'])) { + $factoryConfig->setProxiesTargetDir($this->lazyServices['proxies_target_dir']); + } + + if (! isset($this->lazyServices['write_proxy_files']) || ! $this->lazyServices['write_proxy_files']) { + $factoryConfig->setGeneratorStrategy(new EvaluatingGeneratorStrategy()); + } else { + $factoryConfig->setGeneratorStrategy(new FileWriterGeneratorStrategy( + new FileLocator($factoryConfig->getProxiesTargetDir()) + )); + } + + spl_autoload_register($factoryConfig->getProxyAutoloader()); + + $this->lazyServicesDelegator = new LazyServiceFactory( + new LazyLoadingValueHolderFactory($factoryConfig), + $this->lazyServices['class_map'] + ); + + return $this->lazyServicesDelegator; + } + + /** + * Merge delegators avoiding multiple same delegators for the same service. + * It works with strings and class instances. + * It's not possible to de-duple anonymous functions + * + * @psalm-param DelegatorsConfiguration $config + * @psalm-return DelegatorsConfiguration + */ + private function mergeDelegators(array $config): array + { + foreach ($config as $key => $delegators) { + if (! array_key_exists($key, $this->delegators)) { + $this->delegators[$key] = $delegators; + continue; + } + + foreach ($delegators as $delegator) { + if (! in_array($delegator, $this->delegators[$key], true)) { + $this->delegators[$key][] = $delegator; + } + } + } + + return $this->delegators; + } + + /** + * Create aliases and factories for invokable classes. + * + * If an invokable service name does not match the class it maps to, this + * creates an alias to the class (which will later be mapped as an + * invokable factory). The newly created aliases will be returned as an array. + * + * @param array $invokables + * @return array + */ + private function createAliasesAndFactoriesForInvokables(array $invokables): array + { + $newAliases = []; + + foreach ($invokables as $name => $class) { + $this->factories[$class] = Factory\InvokableFactory::class; + if ($name !== $class) { + $this->aliases[$name] = $class; + $newAliases[$name] = $class; + } + } + + return $newAliases; + } + + /** + * Determine if a service for any name provided by a service + * manager configuration(services, aliases, factories, ...) + * already exists, and if it exists, determine if is it allowed + * to get overriden. + * + * Validation in the context of this class means, that for + * a given service name we do not have a service instance + * in the cache OR override is explicitly allowed. + * + * @psalm-param ServiceManagerConfiguration $config + * @throws ContainerModificationsNotAllowedException If any + * service key is invalid. + */ + private function validateServiceNames(array $config): void + { + if ($this->allowOverride || ! $this->configured) { + return; + } + + if (isset($config['services'])) { + foreach (array_keys($config['services']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + + if (isset($config['aliases'])) { + foreach (array_keys($config['aliases']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + + if (isset($config['invokables'])) { + foreach (array_keys($config['invokables']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + + if (isset($config['factories'])) { + foreach (array_keys($config['factories']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + + if (isset($config['delegators'])) { + foreach (array_keys($config['delegators']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + + if (isset($config['shared'])) { + foreach (array_keys($config['shared']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + + if (isset($config['lazy_services']['class_map'])) { + foreach (array_keys($config['lazy_services']['class_map']) as $service) { + if (isset($this->services[$service])) { + throw ContainerModificationsNotAllowedException::fromExistingService($service); + } + } + } + } + + /** + * Assuming that the alias name is valid (see above) resolve/add it. + * + * This is done differently from bulk mapping aliases for performance reasons, as the + * algorithms for mapping a single item efficiently are different from those of mapping + * many. + */ + private function mapAliasToTarget(string $alias, string $target): void + { + // $target is either an alias or something else + // if it is an alias, resolve it + $this->aliases[$alias] = $this->aliases[$target] ?? $target; + + // a self-referencing alias indicates a cycle + if ($alias === $this->aliases[$alias]) { + throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases); + } + + // finally we have to check if existing incomplete alias definitions + // exist which can get resolved by the new alias + if (in_array($alias, $this->aliases)) { + $r = array_intersect($this->aliases, [$alias]); + // found some, resolve them + foreach ($r as $name => $service) { + $this->aliases[$name] = $target; + } + } + } + + /** + * Assuming that all provided alias keys are valid resolve them. + * + * This function maps $this->aliases in place. + * + * This algorithm is an adaptated version of Tarjans Strongly + * Connected Components. Instead of returning the strongly + * connected components (i.e. cycles in our case), we throw. + * If nodes are not strongly connected (i.e. resolvable in + * our case), they get resolved. + * + * This algorithm is fast for mass updates through configure(). + * It is not appropriate if just a single alias is added. + * + * @see mapAliasToTarget above + */ + private function mapAliasesToTargets(): void + { + $tagged = []; + foreach ($this->aliases as $alias => $target) { + if (isset($tagged[$alias])) { + continue; + } + + $tCursor = $this->aliases[$alias]; + $aCursor = $alias; + if ($aCursor === $tCursor) { + throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases); + } + if (! isset($this->aliases[$tCursor])) { + continue; + } + + $stack = []; + + while (isset($this->aliases[$tCursor])) { + $stack[] = $aCursor; + if ($aCursor === $this->aliases[$tCursor]) { + throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases); + } + $aCursor = $tCursor; + $tCursor = $this->aliases[$tCursor]; + } + + $tagged[$aCursor] = true; + + foreach ($stack as $alias) { + if ($alias === $tCursor) { + throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases); + } + $this->aliases[$alias] = $tCursor; + $tagged[$alias] = true; + } + } + } + + /** + * Instantiate abstract factories in order to avoid checks during service construction. + * + * @param string|Factory\AbstractFactoryInterface $abstractFactory + * @psalm-param class-string|Factory\AbstractFactoryInterface $abstractFactory + */ + private function resolveAbstractFactoryInstance($abstractFactory): void + { + if (is_string($abstractFactory) && class_exists($abstractFactory)) { + // Cached string factory name + if (! isset($this->cachedAbstractFactories[$abstractFactory])) { + $this->cachedAbstractFactories[$abstractFactory] = new $abstractFactory(); + } + + $abstractFactory = $this->cachedAbstractFactories[$abstractFactory]; + } + + if (! $abstractFactory instanceof Factory\AbstractFactoryInterface) { + throw InvalidArgumentException::fromInvalidAbstractFactory($abstractFactory); + } + + $abstractFactoryObjHash = spl_object_hash($abstractFactory); + $this->abstractFactories[$abstractFactoryObjHash] = $abstractFactory; + } + + /** + * Check if a static service or factory exists for the given name. + */ + private function staticServiceOrFactoryCanCreate(string $name): bool + { + if (isset($this->services[$name]) || isset($this->factories[$name])) { + return true; + } + + $resolvedName = $this->aliases[$name] ?? $name; + if ($resolvedName !== $name) { + return $this->staticServiceOrFactoryCanCreate($resolvedName); + } + + return false; + } + + /** + * Check if an abstract factory exists that can create a service for the given name. + */ + private function abstractFactoryCanCreate(string $name): bool + { + foreach ($this->abstractFactories as $abstractFactory) { + if ($abstractFactory->canCreate($this->creationContext, $name)) { + return true; + } + } + + $resolvedName = $this->aliases[$name] ?? $name; + if ($resolvedName !== $name) { + return $this->abstractFactoryCanCreate($resolvedName); + } + + return false; + } + + /** + * @psalm-param mixed $delegatorFactory + * @psalm-assert callable(ContainerInterface,string,callable():object,array|null):object $delegatorFactory + */ + private function assertCallableDelegatorFactory($delegatorFactory): void + { + if ( + $delegatorFactory instanceof Factory\DelegatorFactoryInterface + || is_callable($delegatorFactory) + ) { + return; + } + if (is_string($delegatorFactory)) { + throw new ServiceNotCreatedException(sprintf( + 'An invalid delegator factory was registered; resolved to class or function "%s"' + . ' which does not exist; please provide a valid function name or class name resolving' + . ' to an implementation of %s', + $delegatorFactory, + DelegatorFactoryInterface::class + )); + } + throw new ServiceNotCreatedException(sprintf( + 'A non-callable delegator, "%s", was provided; expected a callable or instance of "%s"', + is_object($delegatorFactory) ? $delegatorFactory::class : gettype($delegatorFactory), + DelegatorFactoryInterface::class + )); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/Test/CommonPluginManagerTrait.php b/vendor/laminas/laminas-servicemanager/src/Test/CommonPluginManagerTrait.php new file mode 100644 index 00000000..7534de4a --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Test/CommonPluginManagerTrait.php @@ -0,0 +1,120 @@ +getPluginManager(); + $reflection = new ReflectionProperty($manager, 'instanceOf'); + $this->assertEquals($this->getInstanceOf(), $reflection->getValue($manager), 'instanceOf does not match'); + } + + public function testShareByDefaultAndSharedByDefault() + { + $manager = $this->getPluginManager(); + $reflection = new ReflectionClass($manager); + $shareByDefault = $sharedByDefault = true; + + foreach ($reflection->getProperties() as $prop) { + if ($prop->getName() === 'shareByDefault') { + $shareByDefault = $prop->getValue($manager); + } + if ($prop->getName() === 'sharedByDefault') { + $sharedByDefault = $prop->getValue($manager); + } + } + + $this->assertSame( + $shareByDefault, + $sharedByDefault, + 'Values of shareByDefault and sharedByDefault do not match' + ); + } + + public function testRegisteringInvalidElementRaisesException() + { + $this->expectException($this->getServiceNotFoundException()); + $this->getPluginManager()->setService('test', $this); + } + + public function testLoadingInvalidElementRaisesException() + { + $manager = $this->getPluginManager(); + $manager->setInvokableClass('test', stdClass::class); + $this->expectException($this->getServiceNotFoundException()); + $manager->get('test'); + } + + /** + * @dataProvider aliasProvider + * @param string $alias + * @param string $expected + */ + public function testPluginAliasesResolve($alias, $expected) + { + $this->assertInstanceOf($expected, $this->getPluginManager()->get($alias), "Alias '$alias' does not resolve'"); + } + + /** + * @return array + */ + public static function aliasProvider(): array + { + $manager = self::getPluginManager(); + $reflection = new ReflectionProperty($manager, 'aliases'); + $data = []; + foreach ($reflection->getValue($manager) as $alias => $expected) { + $data[] = [$alias, $expected]; + } + return $data; + } + + protected function getServiceNotFoundException(): string + { + $manager = $this->getPluginManager(); + if (method_exists($manager, 'configure')) { + return InvalidServiceException::class; + } + return $this->getV2InvalidPluginException(); + } + + /** + * Returns the plugin manager to test + * + * @return AbstractPluginManager + */ + abstract protected static function getPluginManager(); + + /** + * Returns the FQCN of the exception thrown under v2 by `validatePlugin()` + * + * @return mixed + */ + abstract protected function getV2InvalidPluginException(); + + /** + * Returns the value the instanceOf property has been set to + * + * @return string + */ + abstract protected function getInstanceOf(); +} diff --git a/vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumper.php b/vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumper.php new file mode 100644 index 00000000..6dd6b7f6 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumper.php @@ -0,0 +1,255 @@ +validateClassName($className); + + $reflectionClass = new ReflectionClass($className); + + // class is an interface; do nothing + if ($reflectionClass->isInterface()) { + return $config; + } + + // class has no constructor, treat it as an invokable + if (! $reflectionClass->getConstructor()) { + return $this->createInvokable($config, $className); + } + + $constructorArguments = $reflectionClass->getConstructor()->getParameters(); + $constructorArguments = array_filter( + $constructorArguments, + static fn(ReflectionParameter $argument): bool => ! $argument->isOptional() + ); + + // has no required parameters, treat it as an invokable + if (empty($constructorArguments)) { + return $this->createInvokable($config, $className); + } + + $classConfig = []; + + foreach ($constructorArguments as $constructorArgument) { + $type = $constructorArgument->getType(); + $argumentType = $type instanceof ReflectionNamedType && ! $type->isBuiltin() ? $type->getName() : null; + + if ($argumentType === null) { + if ($ignoreUnresolved) { + // don't throw an exception, just return the previous config + return $config; + } + // don't throw an exception if the class is an already defined service + if ($this->container && $this->container->has($className)) { + return $config; + } + throw new InvalidArgumentException(sprintf( + 'Cannot create config for constructor argument "%s", ' + . 'it has no type hint, or non-class/interface type hint', + $constructorArgument->getName() + )); + } + $config = $this->createDependencyConfig($config, $argumentType, $ignoreUnresolved); + $classConfig[] = $argumentType; + } + + $config[ConfigAbstractFactory::class][$className] = $classConfig; + + return $config; + } + + /** + * @param string $className + * @throws InvalidArgumentException If class name is not a string or does + * not exist. + */ + private function validateClassName($className) + { + if (! is_string($className)) { + throw new InvalidArgumentException('Class name must be a string, ' . gettype($className) . ' given'); + } + + if (! class_exists($className) && ! interface_exists($className)) { + throw new InvalidArgumentException('Cannot find class or interface with name ' . $className); + } + } + + /** + * @param string $className + * @return array + */ + private function createInvokable(array $config, $className) + { + $config[ConfigAbstractFactory::class][$className] = []; + return $config; + } + + /** + * @return array + * @throws InvalidArgumentException If ConfigAbstractFactory configuration + * value is not an array. + */ + public function createFactoryMappingsFromConfig(array $config) + { + if (! array_key_exists(ConfigAbstractFactory::class, $config)) { + return $config; + } + + if (! is_array($config[ConfigAbstractFactory::class])) { + throw new InvalidArgumentException( + 'Config key for ' . ConfigAbstractFactory::class . ' should be an array, ' . gettype( + $config[ConfigAbstractFactory::class] + ) . ' given' + ); + } + + foreach ($config[ConfigAbstractFactory::class] as $className => $dependency) { + $config = $this->createFactoryMappings($config, $className); + } + return $config; + } + + /** + * @param string $className + * @return array + */ + public function createFactoryMappings(array $config, $className) + { + $this->validateClassName($className); + + if ( + array_key_exists('service_manager', $config) + && array_key_exists('factories', $config['service_manager']) + && array_key_exists($className, $config['service_manager']['factories']) + ) { + return $config; + } + + $config['service_manager']['factories'][$className] = ConfigAbstractFactory::class; + return $config; + } + + /** + * @return string + */ + public function dumpConfigFile(array $config) + { + $prepared = $this->prepareConfig($config); + return sprintf( + self::CONFIG_TEMPLATE, + static::class, + date('Y-m-d H:i:s'), + $prepared + ); + } + + /** + * @param array|Traversable $config + * @param int $indentLevel + * @return string + */ + private function prepareConfig($config, $indentLevel = 1) + { + $indent = str_repeat(' ', $indentLevel * 4); + $entries = []; + foreach ($config as $key => $value) { + $key = $this->createConfigKey($key); + $entries[] = sprintf( + '%s%s%s,', + $indent, + $key ? sprintf('%s => ', $key) : '', + $this->createConfigValue($value, $indentLevel) + ); + } + + $outerIndent = str_repeat(' ', ($indentLevel - 1) * 4); + + return sprintf( + "[\n%s\n%s]", + implode("\n", $entries), + $outerIndent + ); + } + + /** + * @param string|int|null $key + * @return null|string + */ + private function createConfigKey($key) + { + if (is_string($key) && class_exists($key)) { + return sprintf('\\%s::class', $key); + } + + if (is_int($key)) { + return null; + } + + return sprintf("'%s'", $key); + } + + /** + * @param int $indentLevel + * @return string + */ + private function createConfigValue(mixed $value, $indentLevel) + { + if (is_array($value) || $value instanceof Traversable) { + return $this->prepareConfig($value, $indentLevel + 1); + } + + if (is_string($value) && class_exists($value)) { + return sprintf('\\%s::class', $value); + } + + return var_export($value, true); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumperCommand.php b/vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumperCommand.php new file mode 100644 index 00000000..f9747868 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumperCommand.php @@ -0,0 +1,244 @@ +, + * class: string, + * ignoreUnresolved: bool + * } + */ +class ConfigDumperCommand +{ + public const COMMAND_DUMP = 'dump'; + public const COMMAND_ERROR = 'error'; + public const COMMAND_HELP = 'help'; + + public const DEFAULT_SCRIPT_NAME = self::class; + + public const HELP_TEMPLATE = <<Usage: + + %s [-h|--help|help] [-i|--ignore-unresolved] + +Arguments: + + -h|--help|help This usage message + -i|--ignore-unresolved Ignore classes with unresolved direct dependencies. + Path to a config file for which to generate + configuration. If the file does not exist, it will + be created. If it does exist, it must return an + array, and the file will be updated with new + configuration. + Name of the class to reflect and for which to + generate dependency configuration. + +Reads the provided configuration file (creating it if it does not exist), +and injects it with ConfigAbstractFactory dependency configuration for +the provided class name, writing the changes back to the file. +EOH; + + private ConsoleHelper $helper; + + /** + * @param string $scriptName + */ + public function __construct(private $scriptName = self::DEFAULT_SCRIPT_NAME, ?ConsoleHelper $helper = null) + { + $this->helper = $helper ?: new ConsoleHelper(); + } + + /** + * @param array $args Argument list, minus script name + * @return int Exit status + */ + public function __invoke(array $args) + { + $arguments = $this->parseArgs($args); + + switch ($arguments->command) { + case self::COMMAND_HELP: + $this->help(); + return 0; + case self::COMMAND_ERROR: + $this->helper->writeErrorMessage($arguments->message); + $this->help(STDERR); + return 1; + case self::COMMAND_DUMP: + // fall-through + default: + break; + } + + $dumper = new ConfigDumper(); + try { + $config = $dumper->createDependencyConfig( + $arguments->config, + $arguments->class, + $arguments->ignoreUnresolved + ); + } catch (Exception\InvalidArgumentException $e) { + $this->helper->writeErrorMessage(sprintf( + 'Unable to create config for "%s": %s', + $arguments->class, + $e->getMessage() + )); + $this->help(STDERR); + return 1; + } + + file_put_contents($arguments->configFile, $dumper->dumpConfigFile($config)); + + $this->helper->writeLine(sprintf( + '[DONE] Changes written to %s', + $arguments->configFile + )); + return 0; + } + + /** + * @return object + */ + private function parseArgs(array $args) + { + if (! $args) { + return $this->createHelpArgument(); + } + + $arg1 = array_shift($args); + + if (in_array($arg1, ['-h', '--help', 'help'], true)) { + return $this->createHelpArgument(); + } + + $ignoreUnresolved = false; + if (in_array($arg1, ['-i', '--ignore-unresolved'], true)) { + $ignoreUnresolved = true; + $arg1 = array_shift($args); + } + + if (! $args) { + return $this->createErrorArgument('Missing class name'); + } + + $configFile = $arg1; + switch (file_exists($configFile)) { + case true: + $config = require $configFile; + + if (! is_array($config)) { + return $this->createErrorArgument(sprintf( + 'Configuration at path "%s" does not return an array.', + $configFile + )); + } + + break; + case false: + // fall-through + default: + if (! is_writable(dirname($configFile))) { + return $this->createErrorArgument(sprintf( + 'Cannot create configuration at path "%s"; not writable.', + $configFile + )); + } + + $config = []; + break; + } + + $class = array_shift($args); + + if (! class_exists($class)) { + return $this->createErrorArgument(sprintf( + 'Class "%s" does not exist or could not be autoloaded.', + $class + )); + } + + return $this->createArguments(self::COMMAND_DUMP, $configFile, $config, $class, $ignoreUnresolved); + } + + /** + * @param resource $resource Defaults to STDOUT + * @return void + */ + private function help($resource = STDOUT) + { + $this->helper->writeLine(sprintf( + self::HELP_TEMPLATE, + $this->scriptName + ), true, $resource); + } + + /** + * @param string $command + * @param string $configFile File from which config originates, and to + * which it will be written. + * @param array $config Parsed configuration. + * @param string $class Name of class to reflect. + * @param bool $ignoreUnresolved If to ignore classes with unresolved direct dependencies. + * @return ArgumentObject + */ + private function createArguments($command, $configFile, $config, $class, $ignoreUnresolved) + { + return (object) [ + 'command' => $command, + 'configFile' => $configFile, + 'config' => $config, + 'class' => $class, + 'ignoreUnresolved' => $ignoreUnresolved, + ]; + } + + /** + * @param string $message + * @return ErrorObject + */ + private function createErrorArgument($message) + { + return (object) [ + 'command' => self::COMMAND_ERROR, + 'message' => $message, + ]; + } + + /** + * @return HelpObject + */ + private function createHelpArgument() + { + return (object) [ + 'command' => self::COMMAND_HELP, + ]; + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreator.php b/vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreator.php new file mode 100644 index 00000000..6abcbf69 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreator.php @@ -0,0 +1,165 @@ +getClassName($className); + + return sprintf( + self::FACTORY_TEMPLATE, + preg_replace('/\\\\' . $class . '$/', '', $className), + $this->createImportStatements($className), + $class, + $class, + $class, + $this->createArgumentString($className) + ); + } + + private function getClassName(string $className): string + { + return substr($className, strrpos($className, '\\') + 1); + } + + /** + * @param string $className + * @return array + */ + private function getConstructorParameters($className) + { + $reflectionClass = new ReflectionClass($className); + + if (! $reflectionClass->getConstructor()) { + return []; + } + + $constructorParameters = $reflectionClass->getConstructor()->getParameters(); + + if (empty($constructorParameters)) { + return []; + } + + $constructorParameters = array_filter( + $constructorParameters, + static function (ReflectionParameter $argument): bool { + if ($argument->isOptional()) { + return false; + } + + $type = $argument->getType(); + $class = $type instanceof ReflectionNamedType && ! $type->isBuiltin() ? $type->getName() : null; + + if (null === $class) { + throw new InvalidArgumentException(sprintf( + 'Cannot identify type for constructor argument "%s"; ' + . 'no type hint, or non-class/interface type hint', + $argument->getName() + )); + } + + return true; + } + ); + + if (empty($constructorParameters)) { + return []; + } + + return array_map(static function (ReflectionParameter $parameter): ?string { + $type = $parameter->getType(); + return $type instanceof ReflectionNamedType && ! $type->isBuiltin() ? $type->getName() : null; + }, $constructorParameters); + } + + /** + * @param string $className + * @return string + */ + private function createArgumentString($className) + { + $arguments = array_map(static fn(string $dependency): string + => sprintf('$container->get(\\%s::class)', $dependency), $this->getConstructorParameters($className)); + + switch (count($arguments)) { + case 0: + return ''; + case 1: + return array_shift($arguments); + default: + $argumentPad = str_repeat(' ', 12); + $closePad = str_repeat(' ', 8); + return sprintf( + "\n%s%s\n%s", + $argumentPad, + implode(",\n" . $argumentPad, $arguments), + $closePad + ); + } + } + + private function createImportStatements(string $className): string + { + $imports = array_merge(self::IMPORT_ALWAYS, [$className]); + sort($imports); + return implode("\n", array_map(static fn(string $import): string => sprintf('use %s;', $import), $imports)); + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreatorCommand.php b/vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreatorCommand.php new file mode 100644 index 00000000..a89df165 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreatorCommand.php @@ -0,0 +1,150 @@ +Usage: + + %s [-h|--help|help] + +Arguments: + + -h|--help|help This usage message + Name of the class to reflect and for which to generate + a factory. + +Generates to STDOUT a factory for creating the specified class; this may then +be added to your application, and configured as a factory for the class. +EOH; + + private ConsoleHelper $helper; + + /** + * @param string $scriptName + */ + public function __construct(private $scriptName = self::DEFAULT_SCRIPT_NAME, ?ConsoleHelper $helper = null) + { + $this->helper = $helper ?: new ConsoleHelper(); + } + + /** + * @param array $args Argument list, minus script name + * @return int Exit status + */ + public function __invoke(array $args) + { + $arguments = $this->parseArgs($args); + + switch ($arguments->command) { + case self::COMMAND_HELP: + $this->help(); + return 0; + case self::COMMAND_ERROR: + assert(is_string($arguments->message)); + $this->helper->writeErrorMessage($arguments->message); + $this->help(STDERR); + return 1; + case self::COMMAND_DUMP: + // fall-through + default: + break; + } + + $generator = new FactoryCreator(); + assert(is_string($arguments->class)); + try { + $factory = $generator->createFactory($arguments->class); + } catch (Exception\InvalidArgumentException $e) { + $this->helper->writeErrorMessage(sprintf( + 'Unable to create factory for "%s": %s', + $arguments->class, + $e->getMessage() + )); + $this->help(STDERR); + return 1; + } + + $this->helper->write($factory, false); + return 0; + } + + /** + * @return ArgumentObject + */ + private function parseArgs(array $args) + { + if (! $args) { + return $this->createArguments(self::COMMAND_HELP); + } + + $arg1 = array_shift($args); + + if (in_array($arg1, ['-h', '--help', 'help'], true)) { + return $this->createArguments(self::COMMAND_HELP); + } + + $class = $arg1; + + if (! class_exists($class)) { + return $this->createArguments(self::COMMAND_ERROR, null, sprintf( + 'Class "%s" does not exist or could not be autoloaded.', + $class + )); + } + + return $this->createArguments(self::COMMAND_DUMP, $class); + } + + /** + * @param resource $resource Defaults to STDOUT + * @return void + */ + private function help($resource = STDOUT) + { + $this->helper->writeLine(sprintf( + self::HELP_TEMPLATE, + $this->scriptName + ), true, $resource); + } + + /** + * @param string $command + * @param string|null $class Name of class to reflect. + * @param string|null $error Error message, if any. + * @return ArgumentObject + */ + private function createArguments($command, $class = null, $error = null) + { + return (object) [ + 'command' => $command, + 'class' => $class, + 'message' => $error, + ]; + } +} diff --git a/vendor/laminas/laminas-servicemanager/src/autoload.php b/vendor/laminas/laminas-servicemanager/src/autoload.php new file mode 100644 index 00000000..76bd64e0 --- /dev/null +++ b/vendor/laminas/laminas-servicemanager/src/autoload.php @@ -0,0 +1,21 @@ + ## 🇷🇺 Русским гражданам +> +> Мы, участники Laminas, родились и живем в разных странах. У многих из нас есть друзья, родственники и коллеги как в России, так и в Украине. Некоторые из нас родились в России. Некоторые из нас живут в России. У некоторых бабушки и дедушки сражались с фашистами во Второй мировой войне. Здесь никто не поддерживает фашизм. +> +> У одного из нас есть украинская родственница, которая спаслась из дома вместе с сыном. Поезд задержался из-за бомбежки на дороге впереди. У нас есть друзья, которые прячутся в бомбоубежищах. Мы с тревогой ждем весточки от них после воздушных налетов, которые беспорядочно наносят удары и попадают по больницам, школам, детским садам и домам. Мы не берем это из каких-либо СМИ. Мы наблюдаем это напрямую. +> +> Вы доверяете нам достаточно, чтоб использовать наши программы, и мы просим вас довериться нам вновь. Мы нуждаемся в помощи. Выходите и протестуйте против этой бесполезной войны. Остановите кровопролитие. Скажите "Нет войне!" +> +> ## 🇺🇸 To Citizens of Russia +> +> We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism. +> +> One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences. +> +> You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!" + +`Laminas\Stdlib` is a set of components that implements general purpose utility +class for different scopes like: + +- array utilities functions; +- general messaging systems; +- string wrappers; +- etc. + +--- + +- File issues at https://github.com/laminas/laminas-stdlib/issues +- Documentation is at https://docs.laminas.dev/laminas-stdlib/ + +## Benchmarks + +We provide scripts for benchmarking laminas-stdlib using the +[PHPBench](https://github.com/phpbench/phpbench) framework; these can be +found in the `benchmark/` directory. + +To execute the benchmarks you can run the following command: + +```bash +$ vendor/bin/phpbench run --report=aggregate +``` diff --git a/vendor/laminas/laminas-stdlib/composer.json b/vendor/laminas/laminas-stdlib/composer.json new file mode 100644 index 00000000..bb713ea8 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/composer.json @@ -0,0 +1,64 @@ +{ + "name": "laminas/laminas-stdlib", + "description": "SPL extensions, array utilities, error handlers, and more", + "license": "BSD-3-Clause", + "keywords": [ + "laminas", + "stdlib" + ], + "homepage": "https://laminas.dev", + "support": { + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "source": "https://github.com/laminas/laminas-stdlib", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "chat": "https://laminas.dev/chat", + "forum": "https://discourse.laminas.dev" + }, + "config": { + "sort-packages": true, + "platform": { + "php": "8.1.99" + }, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "extra": { + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "phpbench/phpbench": "^1.2.15", + "phpunit/phpunit": "^10.5.8", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.20.0" + }, + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "LaminasTest\\Stdlib\\": "test/", + "LaminasBench\\Stdlib\\": "benchmark/" + } + }, + "scripts": { + "check": [ + "@cs-check", + "@test" + ], + "cs-check": "phpcs", + "cs-fix": "phpcbf", + "static-analysis": "psalm --shepherd --stats", + "test": "phpunit --colors=always", + "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + } +} diff --git a/vendor/laminas/laminas-stdlib/src/AbstractOptions.php b/vendor/laminas/laminas-stdlib/src/AbstractOptions.php new file mode 100644 index 00000000..5db2ea95 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/AbstractOptions.php @@ -0,0 +1,200 @@ + + */ +abstract class AbstractOptions implements ParameterObjectInterface +{ + // phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore,WebimpressCodingStandard.NamingConventions.ValidVariableName.NotCamelCapsProperty + + /** + * We use the __ prefix to avoid collisions with properties in + * user-implementations. + * + * @var bool + */ + protected $__strictMode__ = true; + + // phpcs:enable + + /** + * Constructor + * + * @param iterable|AbstractOptions|null $options + */ + public function __construct($options = null) + { + if (null !== $options) { + $this->setFromArray($options); + } + } + + /** + * Set one or more configuration properties + * + * @param iterable|AbstractOptions $options + * @throws Exception\InvalidArgumentException + * @return AbstractOptions Provides fluent interface + */ + public function setFromArray($options) + { + if ($options instanceof self) { + $options = $options->toArray(); + } + + if (! is_array($options) && ! $options instanceof Traversable) { + throw new Exception\InvalidArgumentException( + sprintf( + 'Parameter provided to %s must be an %s, %s or %s', + __METHOD__, + 'array', + 'Traversable', + self::class + ) + ); + } + + foreach ($options as $key => $value) { + $this->__set($key, $value); + } + + return $this; + } + + /** + * Cast to array + * + * @return array + */ + public function toArray() + { + $array = []; + + $transform = static function (array $letters): string { + /** @var list $letters */ + $letter = array_shift($letters); + return '_' . strtolower($letter); + }; + + /** @psalm-var TValue $value */ + foreach (get_object_vars($this) as $key => $value) { + if ($key === '__strictMode__') { + continue; + } + $normalizedKey = preg_replace_callback('/([A-Z])/', $transform, $key); + $array[$normalizedKey] = $value; + } + + return $array; + } + + /** + * Set a configuration property + * + * @see ParameterObject::__set() + * + * @param string $key + * @param TValue|null $value + * @throws Exception\BadMethodCallException + * @return void + */ + public function __set($key, $value) + { + $setter = 'set' . str_replace('_', '', $key); + + if (is_callable([$this, $setter])) { + $this->{$setter}($value); + + return; + } + + if ($this->__strictMode__) { + throw new Exception\BadMethodCallException(sprintf( + 'The option "%s" does not have a callable "%s" ("%s") setter method which must be defined', + $key, + 'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))), + $setter + )); + } + } + + /** + * Get a configuration property + * + * @see ParameterObject::__get() + * + * @param string $key + * @throws Exception\BadMethodCallException + * @return TValue + */ + public function __get($key) + { + $getter = 'get' . str_replace('_', '', $key); + + if (is_callable([$this, $getter])) { + return $this->{$getter}(); + } + + throw new Exception\BadMethodCallException(sprintf( + 'The option "%s" does not have a callable "%s" getter method which must be defined', + $key, + 'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))) + )); + } + + /** + * Test if a configuration property is null + * + * @see ParameterObject::__isset() + * + * @param string $key + * @return bool + */ + public function __isset($key) + { + $getter = 'get' . str_replace('_', '', $key); + + return method_exists($this, $getter) && null !== $this->__get($key); + } + + /** + * Set a configuration property to NULL + * + * @see ParameterObject::__unset() + * + * @param string $key + * @throws Exception\InvalidArgumentException + * @return void + */ + public function __unset($key) + { + try { + $this->__set($key, null); + } catch (Exception\BadMethodCallException $e) { + throw new Exception\InvalidArgumentException( + 'The class property $' . $key . ' cannot be unset as' + . ' NULL is an invalid value for it', + 0, + $e + ); + } + } +} diff --git a/vendor/laminas/laminas-stdlib/src/ArrayObject.php b/vendor/laminas/laminas-stdlib/src/ArrayObject.php new file mode 100644 index 00000000..e0cdc710 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/ArrayObject.php @@ -0,0 +1,509 @@ + + * @template-implements ArrayAccess + */ +#[AllowDynamicProperties] +class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable +{ + /** + * Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + */ + public const STD_PROP_LIST = 1; + + /** + * Entries can be accessed as properties (read and write). + */ + public const ARRAY_AS_PROPS = 2; + + /** @var array */ + protected $storage; + + /** @var self::STD_PROP_LIST|self::ARRAY_AS_PROPS */ + protected $flag; + + /** @var class-string */ + protected $iteratorClass; + + /** @var list */ + protected $protectedProperties; + + /** + * @param array|object $input Object values must act like ArrayAccess + * @param self::STD_PROP_LIST|self::ARRAY_AS_PROPS $flags + * @param class-string $iteratorClass + */ + public function __construct($input = [], $flags = self::STD_PROP_LIST, $iteratorClass = ArrayIterator::class) + { + $this->setFlags($flags); + $this->storage = $input; + $this->setIteratorClass($iteratorClass); + $this->protectedProperties = array_keys(get_object_vars($this)); + } + + /** + * Returns whether the requested key exists + * + * @param TKey $key + * @return bool + */ + public function __isset(mixed $key) + { + if ($this->flag === self::ARRAY_AS_PROPS) { + return $this->offsetExists($key); + } + + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException("$key is a protected property, use a different key"); + } + + return isset($this->$key); + } + + /** + * Sets the value at the specified key to value + * + * @param TKey $key + * @param TValue $value + * @return void + */ + public function __set(mixed $key, mixed $value) + { + if ($this->flag === self::ARRAY_AS_PROPS) { + $this->offsetSet($key, $value); + return; + } + + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException("$key is a protected property, use a different key"); + } + + $this->$key = $value; + } + + /** + * Unsets the value at the specified key + * + * @param TKey $key + * @return void + */ + public function __unset(mixed $key) + { + if ($this->flag === self::ARRAY_AS_PROPS) { + $this->offsetUnset($key); + return; + } + + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException("$key is a protected property, use a different key"); + } + + unset($this->$key); + } + + /** + * Returns the value at the specified key by reference + * + * @param TKey $key + * @return TValue|null + */ + public function &__get(mixed $key) + { + if ($this->flag === self::ARRAY_AS_PROPS) { + $ret = &$this->offsetGet($key); + + return $ret; + } + + if (in_array($key, $this->protectedProperties, true)) { + throw new Exception\InvalidArgumentException("$key is a protected property, use a different key"); + } + + return $this->$key; + } + + /** + * Appends the value + * + * @param TValue $value + * @return void + */ + public function append(mixed $value) + { + $this->storage[] = $value; + } + + /** + * Sort the entries by value + * + * @return void + */ + public function asort() + { + asort($this->storage); + } + + /** + * Get the number of public properties in the ArrayObject + * + * @return positive-int|0 + */ + #[ReturnTypeWillChange] + public function count() + { + return count($this->storage); + } + + /** + * Exchange the array for another one. + * + * @param array|ArrayObject|ArrayIterator|object $data + * @return array + */ + public function exchangeArray($data) + { + if (! is_array($data) && ! is_object($data)) { + throw new Exception\InvalidArgumentException( + 'Passed variable is not an array or object, using empty array instead' + ); + } + + if (is_object($data) && ($data instanceof self || $data instanceof \ArrayObject)) { + $data = $data->getArrayCopy(); + } + if (! is_array($data)) { + $data = (array) $data; + } + + $storage = $this->storage; + + $this->storage = $data; + + return $storage; + } + + /** + * Creates a copy of the ArrayObject. + * + * @return array + */ + public function getArrayCopy() + { + return $this->storage; + } + + /** + * Gets the behavior flags. + * + * @return self::STD_PROP_LIST|self::ARRAY_AS_PROPS + */ + public function getFlags() + { + return $this->flag; + } + + /** + * Create a new iterator from an ArrayObject instance + * + * @return Iterator + */ + #[ReturnTypeWillChange] + public function getIterator() + { + $class = $this->iteratorClass; + + return new $class($this->storage); + } + + /** + * Gets the iterator classname for the ArrayObject. + * + * @return class-string + */ + public function getIteratorClass() + { + return $this->iteratorClass; + } + + /** + * Sort the entries by key + * + * @return void + */ + public function ksort() + { + ksort($this->storage); + } + + /** + * Sort an array using a case insensitive "natural order" algorithm + * + * @return void + */ + public function natcasesort() + { + natcasesort($this->storage); + } + + /** + * Sort entries using a "natural order" algorithm + * + * @return void + */ + public function natsort() + { + natsort($this->storage); + } + + /** + * Returns whether the requested key exists + * + * @param TKey $key + * @return bool + */ + #[ReturnTypeWillChange] + public function offsetExists(mixed $key) + { + return isset($this->storage[$key]); + } + + /** + * {@inheritDoc} + * + * @param TKey $key + * @return TValue|null + */ + #[ReturnTypeWillChange] + public function &offsetGet(mixed $key) + { + $ret = null; + if (! $this->offsetExists($key)) { + return $ret; + } + $ret = &$this->storage[$key]; + + return $ret; + } + + /** + * Sets the value at the specified key to value + * + * @param TKey $offset + * @param TValue $value + * @return void + */ + #[ReturnTypeWillChange] + public function offsetSet(mixed $offset, mixed $value) + { + $this->storage[$offset] = $value; + } + + /** + * Unsets the value at the specified key + * + * @param TKey $offset + * @return void + */ + #[ReturnTypeWillChange] + public function offsetUnset(mixed $offset) + { + if ($this->offsetExists($offset)) { + unset($this->storage[$offset]); + } + } + + /** + * Serialize an ArrayObject + * + * @return string + */ + public function serialize() + { + return serialize($this->__serialize()); + } + + /** + * Magic method used for serializing of an instance. + * + * @return array + */ + public function __serialize() + { + return get_object_vars($this); + } + + /** + * Sets the behavior flags + * + * @param self::STD_PROP_LIST|self::ARRAY_AS_PROPS $flags + * @return void + */ + public function setFlags($flags) + { + $this->flag = $flags; + } + + /** + * Sets the iterator classname for the ArrayObject + * + * @param class-string $class + * @return void + */ + public function setIteratorClass($class) + { + if (class_exists($class)) { + $this->iteratorClass = $class; + + return; + } + + if (str_starts_with($class, '\\')) { + $class = '\\' . $class; + if (class_exists($class)) { + $this->iteratorClass = $class; + + return; + } + } + + throw new Exception\InvalidArgumentException('The iterator class does not exist'); + } + + /** + * Sort the entries with a user-defined comparison function and maintain key association + * + * @param callable(TValue, TValue): int $function + * @return void + */ + public function uasort($function) + { + if (is_callable($function)) { + uasort($this->storage, $function); + } + } + + /** + * Sort the entries by keys using a user-defined comparison function + * + * @param callable(TKey, TKey): int $function + * @return void + */ + public function uksort($function) + { + if (is_callable($function)) { + uksort($this->storage, $function); + } + } + + /** + * Unserialize an ArrayObject + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + $toUnserialize = unserialize($data); + if (! is_array($toUnserialize)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance; corrupt serialization data', + self::class + )); + } + + $this->__unserialize($toUnserialize); + } + + /** + * Magic method used to rebuild an instance. + * + * @param array $data Data array. + * @return void + */ + public function __unserialize($data) + { + $this->protectedProperties = array_keys(get_object_vars($this)); + + // Unserialize protected internal properties first + if (array_key_exists('flag', $data)) { + $this->setFlags((int) $data['flag']); + unset($data['flag']); + } + + if (array_key_exists('storage', $data)) { + if (! is_array($data['storage']) && ! is_object($data['storage'])) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance: corrupt storage data; expected array or object, received %s', + self::class, + gettype($data['storage']) + )); + } + $this->exchangeArray($data['storage']); + unset($data['storage']); + } + + if (array_key_exists('iteratorClass', $data)) { + if (! is_string($data['iteratorClass'])) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance: invalid iteratorClass; expected string, received %s', + self::class, + get_debug_type($data['iteratorClass']) + )); + } + $this->setIteratorClass($data['iteratorClass']); + unset($data['iteratorClass']); + } + + unset($data['protectedProperties']); + + // Unserialize array keys after resolving protected properties to ensure configuration is used. + foreach ($data as $k => $v) { + $this->__set($k, $v); + } + } +} diff --git a/vendor/laminas/laminas-stdlib/src/ArraySerializableInterface.php b/vendor/laminas/laminas-stdlib/src/ArraySerializableInterface.php new file mode 100644 index 00000000..adb5231f --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/ArraySerializableInterface.php @@ -0,0 +1,22 @@ + + */ +class ArrayStack extends PhpArrayObject +{ + /** + * Retrieve iterator + * + * Retrieve an array copy of the object, reverse its order, and return an + * ArrayIterator with that reversed array. + * + * @return ArrayIterator + */ + #[ReturnTypeWillChange] + public function getIterator() + { + $array = $this->getArrayCopy(); + return new ArrayIterator(array_reverse($array)); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/ArrayUtils.php b/vendor/laminas/laminas-stdlib/src/ArrayUtils.php new file mode 100644 index 00000000..7bfa20dc --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/ArrayUtils.php @@ -0,0 +1,337 @@ + + * $list = array('a', 'b', 'c', 'd'); + * $list = array( + * 0 => 'foo', + * 1 => 'bar', + * 2 => array('foo' => 'baz'), + * ); + * + * + * @param bool $allowEmpty Is an empty list a valid list? + * @return bool + */ + public static function isList(mixed $value, $allowEmpty = false) + { + if (! is_array($value)) { + return false; + } + + if (! $value) { + return $allowEmpty; + } + + return array_values($value) === $value; + } + + /** + * Test whether an array is a hash table. + * + * An array is a hash table if: + * + * 1. Contains one or more non-integer keys, or + * 2. Integer keys are non-continuous or misaligned (not starting with 0) + * + * For example: + * + * $hash = array( + * 'foo' => 15, + * 'bar' => false, + * ); + * $hash = array( + * 1995 => 'Birth of PHP', + * 2009 => 'PHP 5.3.0', + * 2012 => 'PHP 5.4.0', + * ); + * $hash = array( + * 'formElement, + * 'options' => array( 'debug' => true ), + * ); + * + * + * @param bool $allowEmpty Is an empty array() a valid hash table? + * @return bool + */ + public static function isHashTable(mixed $value, $allowEmpty = false) + { + if (! is_array($value)) { + return false; + } + + if (! $value) { + return $allowEmpty; + } + + return array_values($value) !== $value; + } + + /** + * Checks if a value exists in an array. + * + * Due to "foo" == 0 === TRUE with in_array when strict = false, an option + * has been added to prevent this. When $strict = 0/false, the most secure + * non-strict check is implemented. if $strict = -1, the default in_array + * non-strict behaviour is used. + * + * @deprecated This method will be removed in version 4.0 of this component + * + * @param array $haystack + * @param int|bool $strict + * @return bool + */ + public static function inArray(mixed $needle, array $haystack, $strict = false) + { + if ((bool) $strict === false) { + if (is_int($needle) || is_float($needle)) { + $needle = (string) $needle; + } + if (is_string($needle)) { + foreach ($haystack as &$h) { + if (is_int($h) || is_float($h)) { + $h = (string) $h; + } + } + } + } + + return in_array($needle, $haystack, (bool) $strict); + } + + /** + * Converts an iterator to an array. The $recursive flag, on by default, + * hints whether or not you want to do so recursively. + * + * @template TKey + * @template TValue + * @param iterable $iterator The array or Traversable object to convert + * @param bool $recursive Recursively check all nested structures + * @throws Exception\InvalidArgumentException If $iterator is not an array or a Traversable object. + * @return array + */ + public static function iteratorToArray($iterator, $recursive = true) + { + /** @psalm-suppress DocblockTypeContradiction */ + if (! is_array($iterator) && ! $iterator instanceof Traversable) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable object'); + } + + if (! $recursive) { + if (is_array($iterator)) { + return $iterator; + } + + return iterator_to_array($iterator); + } + + if ( + is_object($iterator) + && ! $iterator instanceof Iterator + && method_exists($iterator, 'toArray') + ) { + /** @psalm-var array $array */ + $array = $iterator->toArray(); + + return $array; + } + + $array = []; + foreach ($iterator as $key => $value) { + if (is_scalar($value)) { + $array[$key] = $value; + continue; + } + + if ($value instanceof Traversable) { + $array[$key] = static::iteratorToArray($value, $recursive); + continue; + } + + if (is_array($value)) { + $array[$key] = static::iteratorToArray($value, $recursive); + continue; + } + + $array[$key] = $value; + } + + /** @psalm-var array $array */ + + return $array; + } + + /** + * Merge two arrays together. + * + * If an integer key exists in both arrays and preserveNumericKeys is false, the value + * from the second array will be appended to the first array. If both values are arrays, they + * are merged together, else the value of the second array overwrites the one of the first array. + * + * @param array $a + * @param array $b + * @param bool $preserveNumericKeys + * @return array + */ + public static function merge(array $a, array $b, $preserveNumericKeys = false) + { + foreach ($b as $key => $value) { + if ($value instanceof MergeReplaceKeyInterface) { + $a[$key] = $value->getData(); + } elseif (isset($a[$key]) || array_key_exists($key, $a)) { + if ($value instanceof MergeRemoveKey) { + unset($a[$key]); + } elseif (! $preserveNumericKeys && is_int($key)) { + $a[] = $value; + } elseif (is_array($value) && is_array($a[$key])) { + $a[$key] = static::merge($a[$key], $value, $preserveNumericKeys); + } else { + $a[$key] = $value; + } + } else { + if (! $value instanceof MergeRemoveKey) { + $a[$key] = $value; + } + } + } + + return $a; + } + + /** + * @deprecated Since 3.2.0; use the native array_filter methods + * + * @param callable $callback + * @param null|int $flag + * @return array + * @throws Exception\InvalidArgumentException + */ + public static function filter(array $data, $callback, $flag = null) + { + if (! is_callable($callback)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Second parameter of %s must be callable', + __METHOD__ + )); + } + + return array_filter($data, $callback, $flag ?? 0); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeRemoveKey.php b/vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeRemoveKey.php new file mode 100644 index 00000000..bde0b25a --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeRemoveKey.php @@ -0,0 +1,9 @@ +data; + } +} diff --git a/vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php b/vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php new file mode 100644 index 00000000..47243fc2 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php @@ -0,0 +1,16 @@ +message`, + * `message`) + * - Write output to a specified stream, optionally with colorization. + * - Write a line of output to a specified stream, optionally with + * colorization, using the system EOL sequence.. + * - Write an error message to STDERR. + * + * Colorization will only occur when expected sequences are discovered, and + * then, only if the console terminal allows it. + * + * Essentially, provides the bare minimum to allow you to provide messages to + * the current console. + */ +class ConsoleHelper +{ + public const COLOR_GREEN = "\033[32m"; + public const COLOR_RED = "\033[31m"; + public const COLOR_RESET = "\033[0m"; + + public const HIGHLIGHT_INFO = 'info'; + public const HIGHLIGHT_ERROR = 'error'; + + /** @psalm-var array */ + private array $highlightMap = [ + self::HIGHLIGHT_INFO => self::COLOR_GREEN, + self::HIGHLIGHT_ERROR => self::COLOR_RED, + ]; + + /** @var string Exists only for testing. */ + private string $eol = PHP_EOL; + + /** @var resource Exists only for testing. */ + private $stderr = STDERR; + + private bool $supportsColor; + + /** + * @param resource $resource + */ + public function __construct($resource = STDOUT) + { + $this->supportsColor = $this->detectColorCapabilities($resource); + } + + /** + * Colorize a string for use with the terminal. + * + * Takes strings formatted as `string` and formats them per the + * $highlightMap; if color support is disabled, simply removes the formatting + * tags. + * + * @param string $string + * @return string + */ + public function colorize($string) + { + $reset = $this->supportsColor ? self::COLOR_RESET : ''; + foreach ($this->highlightMap as $key => $color) { + $pattern = sprintf('#<%s>(.*?)#s', $key, $key); + $color = $this->supportsColor ? $color : ''; + $string = preg_replace($pattern, $color . '$1' . $reset, $string); + } + return $string; + } + + /** + * @param string $string + * @param bool $colorize Whether or not to colorize the string + * @param resource $resource Defaults to STDOUT + * @return void + */ + public function write($string, $colorize = true, $resource = STDOUT) + { + if ($colorize) { + $string = $this->colorize($string); + } + + $string = $this->formatNewlines($string); + + fwrite($resource, $string); + } + + /** + * @param string $string + * @param bool $colorize Whether or not to colorize the line + * @param resource $resource Defaults to STDOUT + * @return void + */ + public function writeLine($string, $colorize = true, $resource = STDOUT) + { + $this->write($string . $this->eol, $colorize, $resource); + } + + /** + * Emit an error message. + * + * Wraps the message in ``, and passes it to `writeLine()`, + * using STDERR as the resource; emits an additional empty line when done, + * also to STDERR. + * + * @param string $message + * @return void + */ + public function writeErrorMessage($message) + { + $this->writeLine(sprintf('%s', $message), true, $this->stderr); + $this->writeLine('', false, $this->stderr); + } + + /** + * @param resource $resource + * @return bool + */ + private function detectColorCapabilities($resource = STDOUT) + { + if ('\\' === DIRECTORY_SEPARATOR) { + // Windows + return false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM'); + } + + return function_exists('posix_isatty') && posix_isatty($resource); + } + + /** + * Ensure newlines are appropriate for the current terminal. + * + * @param string $string + * @return string + */ + private function formatNewlines($string) + { + $string = str_replace($this->eol, "\0PHP_EOL\0", $string); + $string = preg_replace("/(\r\n|\n|\r)/", $this->eol, $string); + return str_replace("\0PHP_EOL\0", $this->eol, $string); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/DispatchableInterface.php b/vendor/laminas/laminas-stdlib/src/DispatchableInterface.php new file mode 100644 index 00000000..a9b325a6 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/DispatchableInterface.php @@ -0,0 +1,15 @@ + + */ + protected static $stack = []; + + /** + * Check if this error handler is active + * + * @return bool + */ + public static function started() + { + return (bool) static::getNestedLevel(); + } + + /** + * Get the current nested level + * + * @return int + */ + public static function getNestedLevel() + { + return count(static::$stack); + } + + /** + * Starting the error handler + * + * @param int $errorLevel + * @return void + */ + public static function start($errorLevel = E_WARNING) + { + if (! static::$stack) { + set_error_handler([static::class, 'addError'], $errorLevel); + } + + static::$stack[] = null; + } + + /** + * Stopping the error handler + * + * @param bool $throw Throw the ErrorException if any + * @return null|ErrorException + * @throws ErrorException If an error has been caught and $throw is true. + */ + public static function stop($throw = false) + { + $errorException = null; + + if (static::$stack) { + $errorException = array_pop(static::$stack); + + if (! static::$stack) { + restore_error_handler(); + } + + if ($errorException && $throw) { + throw $errorException; + } + } + + return $errorException; + } + + /** + * Stop all active handler + * + * @return void + */ + public static function clean() + { + if (static::$stack) { + restore_error_handler(); + } + + static::$stack = []; + } + + /** + * Add an error to the stack + * + * @param int $errno + * @param string $errstr + * @param string $errfile + * @param int $errline + * @return void + */ + public static function addError($errno, $errstr = '', $errfile = '', $errline = 0) + { + $stack = &static::$stack[count(static::$stack) - 1]; + $stack = new ErrorException($errstr, 0, $errno, $errfile, $errline, $stack); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/Exception/BadMethodCallException.php b/vendor/laminas/laminas-stdlib/src/Exception/BadMethodCallException.php new file mode 100644 index 00000000..a62b9171 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/Exception/BadMethodCallException.php @@ -0,0 +1,12 @@ + + */ +class FastPriorityQueue implements Iterator, Countable, Serializable +{ + public const EXTR_DATA = PhpSplPriorityQueue::EXTR_DATA; + public const EXTR_PRIORITY = PhpSplPriorityQueue::EXTR_PRIORITY; + public const EXTR_BOTH = PhpSplPriorityQueue::EXTR_BOTH; + + /** @var self::EXTR_* */ + protected $extractFlag = self::EXTR_DATA; + + /** + * Elements of the queue, divided by priorities + * + * @var array> + */ + protected $values = []; + + /** + * Array of priorities + * + * @var array + */ + protected $priorities = []; + + /** + * Array of priorities used for the iteration + * + * @var array + */ + protected $subPriorities = []; + + /** + * Max priority + * + * @var int|null + */ + protected $maxPriority; + + /** + * Total number of elements in the queue + * + * @var int + */ + protected $count = 0; + + /** + * Index of the current element in the queue + * + * @var int + */ + protected $index = 0; + + /** + * Sub index of the current element in the same priority level + * + * @var int + */ + protected $subIndex = 0; + + public function __serialize(): array + { + $clone = clone $this; + $clone->setExtractFlags(self::EXTR_BOTH); + + $data = []; + foreach ($clone as $item) { + $data[] = $item; + } + + return $data; + } + + public function __unserialize(array $data): void + { + foreach ($data as $item) { + $this->insert($item['data'], $item['priority']); + } + } + + /** + * Insert an element in the queue with a specified priority + * + * @param TValue $value + * @param int $priority + * @return void + */ + public function insert(mixed $value, $priority) + { + if (! is_int($priority)) { + throw new Exception\InvalidArgumentException('The priority must be an integer'); + } + $this->values[$priority][] = $value; + if (! isset($this->priorities[$priority])) { + $this->priorities[$priority] = $priority; + $this->maxPriority = $this->maxPriority === null ? $priority : max($priority, $this->maxPriority); + } + ++$this->count; + } + + /** + * Extract an element in the queue according to the priority and the + * order of insertion + * + * @return TValue|int|array{data: TValue, priority: int}|false + */ + public function extract() + { + if (! $this->valid()) { + return false; + } + $value = $this->current(); + $this->nextAndRemove(); + return $value; + } + + /** + * Remove an item from the queue + * + * This is different than {@link extract()}; its purpose is to dequeue an + * item. + * + * Note: this removes the first item matching the provided item found. If + * the same item has been added multiple times, it will not remove other + * instances. + * + * @return bool False if the item was not found, true otherwise. + */ + public function remove(mixed $datum) + { + $currentIndex = $this->index; + $currentSubIndex = $this->subIndex; + $currentPriority = $this->maxPriority; + + $this->rewind(); + while ($this->valid()) { + if (current($this->values[$this->maxPriority]) === $datum) { + $index = key($this->values[$this->maxPriority]); + unset($this->values[$this->maxPriority][$index]); + + // The `next()` method advances the internal array pointer, so we need to use the `reset()` function, + // otherwise we would lose all elements before the place the pointer points. + reset($this->values[$this->maxPriority]); + + $this->index = $currentIndex; + $this->subIndex = $currentSubIndex; + + // If the array is empty we need to destroy the unnecessary priority, + // otherwise we would end up with an incorrect value of `$this->count` + // {@see \Laminas\Stdlib\FastPriorityQueue::nextAndRemove()}. + if (empty($this->values[$this->maxPriority])) { + unset($this->values[$this->maxPriority]); + unset($this->priorities[$this->maxPriority]); + if ($this->maxPriority === $currentPriority) { + $this->subIndex = 0; + } + } + + $this->maxPriority = empty($this->priorities) ? null : max($this->priorities); + --$this->count; + return true; + } + $this->next(); + } + return false; + } + + /** + * Get the total number of elements in the queue + * + * @return int + */ + #[ReturnTypeWillChange] + public function count() + { + return $this->count; + } + + /** + * Get the current element in the queue + * + * @return TValue|int|array{data: TValue|false, priority: int|null}|false + */ + #[ReturnTypeWillChange] + public function current() + { + switch ($this->extractFlag) { + case self::EXTR_DATA: + return current($this->values[$this->maxPriority]); + case self::EXTR_PRIORITY: + return $this->maxPriority; + case self::EXTR_BOTH: + return [ + 'data' => current($this->values[$this->maxPriority]), + 'priority' => $this->maxPriority, + ]; + } + } + + /** + * Get the index of the current element in the queue + * + * @return int + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->index; + } + + /** + * Set the iterator pointer to the next element in the queue + * removing the previous element + * + * @return void + */ + protected function nextAndRemove() + { + $key = key($this->values[$this->maxPriority]); + + if (false === next($this->values[$this->maxPriority])) { + unset($this->priorities[$this->maxPriority]); + unset($this->values[$this->maxPriority]); + $this->maxPriority = empty($this->priorities) ? null : max($this->priorities); + $this->subIndex = -1; + } else { + unset($this->values[$this->maxPriority][$key]); + } + ++$this->index; + ++$this->subIndex; + --$this->count; + } + + /** + * Set the iterator pointer to the next element in the queue + * without removing the previous element + */ + #[ReturnTypeWillChange] + public function next() + { + if (false === next($this->values[$this->maxPriority])) { + unset($this->subPriorities[$this->maxPriority]); + reset($this->values[$this->maxPriority]); + $this->maxPriority = empty($this->subPriorities) ? null : max($this->subPriorities); + $this->subIndex = -1; + } + ++$this->index; + ++$this->subIndex; + } + + /** + * Check if the current iterator is valid + * + * @return bool + */ + #[ReturnTypeWillChange] + public function valid() + { + return isset($this->values[$this->maxPriority]); + } + + /** + * Rewind the current iterator + */ + #[ReturnTypeWillChange] + public function rewind() + { + $this->subPriorities = $this->priorities; + $this->maxPriority = empty($this->priorities) ? 0 : max($this->priorities); + $this->index = 0; + $this->subIndex = 0; + } + + /** + * Serialize to an array + * + * Array will be priority => data pairs + * + * @return list + */ + public function toArray() + { + $array = []; + foreach (clone $this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + public function serialize() + { + return serialize($this->__serialize()); + } + + /** + * Deserialize + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + $toUnserialize = unserialize($data); + if (! is_array($toUnserialize)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance; corrupt serialization data', + self::class + )); + } + + $this->__unserialize($toUnserialize); + } + + /** + * Set the extract flag + * + * @param self::EXTR_* $flag + * @return void + */ + public function setExtractFlags($flag) + { + $this->extractFlag = match ($flag) { + self::EXTR_DATA, self::EXTR_PRIORITY, self::EXTR_BOTH => $flag, + default => throw new Exception\InvalidArgumentException("The extract flag specified is not valid"), + }; + } + + /** + * Check if the queue is empty + * + * @return bool + */ + public function isEmpty() + { + return empty($this->values); + } + + /** + * Does the queue contain the given datum? + * + * @return bool + */ + public function contains(mixed $datum) + { + foreach ($this->values as $values) { + if (in_array($datum, $values)) { + return true; + } + } + return false; + } + + /** + * Does the queue have an item with the given priority? + * + * @param int $priority + * @return bool + */ + public function hasPriority($priority) + { + return isset($this->values[$priority]); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/Glob.php b/vendor/laminas/laminas-stdlib/src/Glob.php new file mode 100644 index 00000000..5b5be710 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/Glob.php @@ -0,0 +1,226 @@ + GLOB_MARK, + self::GLOB_NOSORT => GLOB_NOSORT, + self::GLOB_NOCHECK => GLOB_NOCHECK, + self::GLOB_NOESCAPE => GLOB_NOESCAPE, + self::GLOB_BRACE => defined('GLOB_BRACE') ? GLOB_BRACE : 0, + self::GLOB_ONLYDIR => GLOB_ONLYDIR, + self::GLOB_ERR => GLOB_ERR, + ]; + + $globFlags = 0; + + foreach ($flagMap as $internalFlag => $globFlag) { + if ($flags & $internalFlag) { + $globFlags |= $globFlag; + } + } + } else { + $globFlags = 0; + } + + ErrorHandler::start(); + $res = glob($pattern, $globFlags); + $err = ErrorHandler::stop(); + if ($res === false) { + throw new Exception\RuntimeException("glob('{$pattern}', {$globFlags}) failed", 0, $err); + } + return $res; + } + + /** + * Expand braces manually, then use the system glob. + * + * @param string $pattern + * @param int $flags + * @return array + * @throws Exception\RuntimeException + */ + protected static function fallbackGlob($pattern, $flags) + { + if (! self::flagsIsEqualTo($flags, self::GLOB_BRACE)) { + return static::systemGlob($pattern, $flags); + } + + $flags &= ~self::GLOB_BRACE; + $length = strlen($pattern); + $paths = []; + + if ($flags & self::GLOB_NOESCAPE) { + $begin = strpos($pattern, '{'); + } else { + $begin = 0; + + while (true) { + if ($begin === $length) { + $begin = false; + break; + } elseif ($pattern[$begin] === '\\' && ($begin + 1) < $length) { + $begin++; + } elseif ($pattern[$begin] === '{') { + break; + } + + $begin++; + } + } + + if ($begin === false) { + return static::systemGlob($pattern, $flags); + } + + $next = static::nextBraceSub($pattern, $begin + 1, $flags); + + if ($next === null) { + return static::systemGlob($pattern, $flags); + } + + $rest = $next; + + while ($pattern[$rest] !== '}') { + $rest = static::nextBraceSub($pattern, $rest + 1, $flags); + + if ($rest === null) { + return static::systemGlob($pattern, $flags); + } + } + + $p = $begin + 1; + + while (true) { + $subPattern = substr($pattern, 0, $begin) + . substr($pattern, $p, $next - $p) + . substr($pattern, $rest + 1); + + $result = static::fallbackGlob($subPattern, $flags | self::GLOB_BRACE); + + if ($result) { + $paths = array_merge($paths, $result); + } + + if ($pattern[$next] === '}') { + break; + } + + $p = $next + 1; + $next = static::nextBraceSub($pattern, $p, $flags); + } + + return array_unique($paths); + } + + /** + * Find the end of the sub-pattern in a brace expression. + * + * @param string $pattern + * @param int $begin + * @param int $flags + * @return int|null + */ + protected static function nextBraceSub($pattern, $begin, $flags) + { + $length = strlen($pattern); + $depth = 0; + $current = $begin; + + while ($current < $length) { + $flagsEqualsNoEscape = self::flagsIsEqualTo($flags, self::GLOB_NOESCAPE); + + if ($flagsEqualsNoEscape && $pattern[$current] === '\\') { + if (++$current === $length) { + break; + } + + $current++; + } else { + if ( + ($pattern[$current] === '}' && $depth-- === 0) + || ($pattern[$current] === ',' && $depth === 0) + ) { + break; + } elseif ($pattern[$current++] === '{') { + $depth++; + } + } + } + + return $current < $length ? $current : null; + } + + /** @internal */ + public static function flagsIsEqualTo(int $flags, int $otherFlags): bool + { + return (bool) ($flags & $otherFlags); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/Guard/AllGuardsTrait.php b/vendor/laminas/laminas-stdlib/src/Guard/AllGuardsTrait.php new file mode 100644 index 00000000..b5abe5a6 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/Guard/AllGuardsTrait.php @@ -0,0 +1,15 @@ +metadata[$spec] = $value; + return $this; + } + if (! is_array($spec) && ! $spec instanceof Traversable) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expected a string, array, or Traversable argument in first position; received "%s"', + get_debug_type($spec) + )); + } + foreach ($spec as $key => $value) { + $this->metadata[$key] = $value; + } + return $this; + } + + /** + * Retrieve all metadata or a single metadatum as specified by key + * + * @param null|string|int $key + * @param null|mixed $default + * @throws Exception\InvalidArgumentException + * @return mixed + */ + public function getMetadata($key = null, $default = null) + { + if (null === $key) { + return $this->metadata; + } + + if (! is_scalar($key)) { + throw new Exception\InvalidArgumentException('Non-scalar argument provided for key'); + } + + if (array_key_exists($key, $this->metadata)) { + return $this->metadata[$key]; + } + + return $default; + } + + /** + * Set message content + * + * @param mixed $value + * @return Message + */ + public function setContent($value) + { + $this->content = $value; + return $this; + } + + /** + * Get message content + * + * @return mixed + */ + public function getContent() + { + return $this->content; + } + + /** + * @return string + */ + public function toString() + { + $request = ''; + foreach ($this->getMetadata() as $key => $value) { + $request .= sprintf( + "%s: %s\r\n", + (string) $key, + (string) $value + ); + } + $request .= "\r\n" . $this->getContent(); + return $request; + } +} diff --git a/vendor/laminas/laminas-stdlib/src/MessageInterface.php b/vendor/laminas/laminas-stdlib/src/MessageInterface.php new file mode 100644 index 00000000..71a48208 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/MessageInterface.php @@ -0,0 +1,41 @@ + + * @template-implements ParametersInterface + */ +class Parameters extends PhpArrayObject implements ParametersInterface +{ + /** + * Constructor + * + * Enforces that we have an array, and enforces parameter access to array + * elements. + * + * @param array|null $values + */ + public function __construct(?array $values = null) + { + if (null === $values) { + $values = []; + } + parent::__construct($values, ArrayObject::ARRAY_AS_PROPS); + } + + /** + * Populate from native PHP array + * + * @param array $values + * @return void + */ + public function fromArray(array $values) + { + $this->exchangeArray($values); + } + + /** + * Populate from query string + * + * @param string $string + * @return void + */ + public function fromString($string) + { + $array = []; + parse_str($string, $array); + $this->fromArray($array); + } + + /** + * Serialize to native PHP array + * + * @return array + */ + public function toArray() + { + return $this->getArrayCopy(); + } + + /** + * Serialize to query string + * + * @return string + */ + public function toString() + { + return http_build_query($this->toArray()); + } + + /** + * Retrieve by key + * + * Returns null if the key does not exist. + * + * @param TKey $name + * @return TValue|null + */ + #[ReturnTypeWillChange] + public function offsetGet($name) + { + if ($this->offsetExists($name)) { + return parent::offsetGet($name); + } + + return null; + } + + /** + * @template TDefault + * @param TKey $name + * @param TDefault $default optional default value + * @return TValue|TDefault|null + */ + public function get($name, $default = null) + { + if ($this->offsetExists($name)) { + return parent::offsetGet($name); + } + return $default; + } + + /** + * @param TKey $name + * @param TValue $value + * @return $this + */ + public function set($name, $value) + { + $this[$name] = $value; + return $this; + } +} diff --git a/vendor/laminas/laminas-stdlib/src/ParametersInterface.php b/vendor/laminas/laminas-stdlib/src/ParametersInterface.php new file mode 100644 index 00000000..9b9a0c4c --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/ParametersInterface.php @@ -0,0 +1,82 @@ + + * @template-extends Traversable + */ +interface ParametersInterface extends ArrayAccess, Countable, Serializable, Traversable +{ + /** + * Constructor + * + * @param array|null $values + */ + public function __construct(?array $values = null); + + /** + * From array + * + * Allow deserialization from standard array + * + * @param array $values + * @return mixed + */ + public function fromArray(array $values); + + /** + * From string + * + * Allow deserialization from raw body; e.g., for PUT requests + * + * @param string $string + * @return mixed + */ + public function fromString($string); + + /** + * To array + * + * Allow serialization back to standard array + * + * @return array + */ + public function toArray(); + + /** + * To string + * + * Allow serialization to query format; e.g., for PUT or POST requests + * + * @return string + */ + public function toString(); + + /** + * @param TKey $name + * @param TValue|null $default + * @return mixed + */ + public function get($name, $default = null); + + /** + * @param TKey $name + * @param TValue $value + * @return ParametersInterface + */ + public function set($name, $value); +} diff --git a/vendor/laminas/laminas-stdlib/src/PriorityList.php b/vendor/laminas/laminas-stdlib/src/PriorityList.php new file mode 100644 index 00000000..8e2c6e53 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/PriorityList.php @@ -0,0 +1,287 @@ + + */ +class PriorityList implements Iterator, Countable +{ + public const EXTR_DATA = 0x00000001; + public const EXTR_PRIORITY = 0x00000002; + public const EXTR_BOTH = 0x00000003; + + /** + * Internal list of all items. + * + * @var array + */ + protected $items = []; + + /** + * Serial assigned to items to preserve LIFO. + * + * @var positive-int|0 + */ + protected $serial = 0; + + // phpcs:disable WebimpressCodingStandard.NamingConventions.ValidVariableName.NotCamelCapsProperty + + /** + * Serial order mode + * + * @var integer + */ + protected $isLIFO = 1; + + // phpcs:enable + + /** + * Internal counter to avoid usage of count(). + * + * @var int + */ + protected $count = 0; + + /** + * Whether the list was already sorted. + * + * @var bool + */ + protected $sorted = false; + + /** + * Insert a new item. + * + * @param TKey $name + * @param TValue $value + * @param int $priority + * @return void + */ + public function insert($name, mixed $value, $priority = 0) + { + if (! isset($this->items[$name])) { + $this->count++; + } + + $this->sorted = false; + + $this->items[$name] = [ + 'data' => $value, + 'priority' => (int) $priority, + 'serial' => $this->serial++, + ]; + } + + /** + * @param TKey $name + * @param int $priority + * @return $this + * @throws Exception + */ + public function setPriority($name, $priority) + { + if (! isset($this->items[$name])) { + throw new Exception("item $name not found"); + } + + $this->items[$name]['priority'] = (int) $priority; + $this->sorted = false; + + return $this; + } + + /** + * Remove a item. + * + * @param TKey $name + * @return void + */ + public function remove($name) + { + if (isset($this->items[$name])) { + $this->count--; + } + + unset($this->items[$name]); + } + + /** + * Remove all items. + * + * @return void + */ + public function clear() + { + $this->items = []; + $this->serial = 0; + $this->count = 0; + $this->sorted = false; + } + + /** + * Get a item. + * + * @param TKey $name + * @return TValue|null + */ + public function get($name) + { + if (! isset($this->items[$name])) { + return; + } + + return $this->items[$name]['data']; + } + + /** + * Sort all items. + * + * @return void + */ + protected function sort() + { + if (! $this->sorted) { + uasort($this->items, [$this, 'compare']); + $this->sorted = true; + } + } + + /** + * Compare the priority of two items. + * + * @param array $item1, + * @return int + */ + protected function compare(array $item1, array $item2) + { + return $item1['priority'] === $item2['priority'] + ? ($item1['serial'] > $item2['serial'] ? -1 : 1) * $this->isLIFO + : ($item1['priority'] > $item2['priority'] ? -1 : 1); + } + + /** + * Get/Set serial order mode + * + * @param bool|null $flag + * @return bool + */ + public function isLIFO($flag = null) + { + if ($flag !== null) { + $isLifo = $flag === true ? 1 : -1; + + if ($isLifo !== $this->isLIFO) { + $this->isLIFO = $isLifo; + $this->sorted = false; + } + } + + return 1 === $this->isLIFO; + } + + /** + * {@inheritDoc} + */ + #[ReturnTypeWillChange] + public function rewind() + { + $this->sort(); + reset($this->items); + } + + /** + * {@inheritDoc} + */ + #[ReturnTypeWillChange] + public function current() + { + $this->sorted || $this->sort(); + $node = current($this->items); + + return $node ? $node['data'] : false; + } + + /** + * {@inheritDoc} + */ + #[ReturnTypeWillChange] + public function key() + { + $this->sorted || $this->sort(); + return key($this->items); + } + + /** + * {@inheritDoc} + */ + #[ReturnTypeWillChange] + public function next() + { + $node = next($this->items); + + return $node ? $node['data'] : false; + } + + /** + * {@inheritDoc} + */ + #[ReturnTypeWillChange] + public function valid() + { + return current($this->items) !== false; + } + + /** + * @return self + */ + public function getIterator() + { + return clone $this; + } + + /** + * {@inheritDoc} + */ + #[ReturnTypeWillChange] + public function count() + { + return $this->count; + } + + /** + * Return list as array + * + * @param int $flag + * @return array + */ + public function toArray($flag = self::EXTR_DATA) + { + $this->sort(); + + if ($flag === self::EXTR_BOTH) { + return $this->items; + } + + return array_map( + static fn($item) => $flag === self::EXTR_PRIORITY ? $item['priority'] : $item['data'], + $this->items + ); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/PriorityQueue.php b/vendor/laminas/laminas-stdlib/src/PriorityQueue.php new file mode 100644 index 00000000..b4258023 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/PriorityQueue.php @@ -0,0 +1,379 @@ + + */ +class PriorityQueue implements Countable, IteratorAggregate, Serializable +{ + public const EXTR_DATA = 0x00000001; + public const EXTR_PRIORITY = 0x00000002; + public const EXTR_BOTH = 0x00000003; + + /** + * Inner queue class to use for iteration + * + * @var class-string<\SplPriorityQueue> + */ + protected $queueClass = SplPriorityQueue::class; + + /** + * Actual items aggregated in the priority queue. Each item is an array + * with keys "data" and "priority". + * + * @var list + */ + protected $items = []; + + /** + * Inner queue object + * + * @var \SplPriorityQueue|null + */ + protected $queue; + + /** + * Insert an item into the queue + * + * Priority defaults to 1 (low priority) if none provided. + * + * @param TValue $data + * @param TPriority $priority + * @return $this + */ + public function insert($data, $priority = 1) + { + /** @psalm-var TPriority $priority */ + $priority = (int) $priority; + $this->items[] = [ + 'data' => $data, + 'priority' => $priority, + ]; + $this->getQueue()->insert($data, $priority); + return $this; + } + + /** + * Remove an item from the queue + * + * This is different than {@link extract()}; its purpose is to dequeue an + * item. + * + * This operation is potentially expensive, as it requires + * re-initialization and re-population of the inner queue. + * + * Note: this removes the first item matching the provided item found. If + * the same item has been added multiple times, it will not remove other + * instances. + * + * @return bool False if the item was not found, true otherwise. + */ + public function remove(mixed $datum) + { + $found = false; + $key = null; + foreach ($this->items as $key => $item) { + if ($item['data'] === $datum) { + $found = true; + break; + } + } + if ($found && $key !== null) { + unset($this->items[$key]); + $this->queue = null; + + if (! $this->isEmpty()) { + $queue = $this->getQueue(); + foreach ($this->items as $item) { + $queue->insert($item['data'], $item['priority']); + } + } + return true; + } + return false; + } + + /** + * Is the queue empty? + * + * @return bool + */ + public function isEmpty() + { + return 0 === $this->count(); + } + + /** + * How many items are in the queue? + * + * @return int + */ + #[ReturnTypeWillChange] + public function count() + { + return count($this->items); + } + + /** + * Peek at the top node in the queue, based on priority. + * + * @return TValue + */ + public function top() + { + $queue = clone $this->getQueue(); + + return $queue->top(); + } + + /** + * Extract a node from the inner queue and sift up + * + * @return TValue + */ + public function extract() + { + $value = $this->getQueue()->extract(); + + $keyToRemove = null; + $highestPriority = null; + foreach ($this->items as $key => $item) { + if ($item['data'] !== $value) { + continue; + } + + if (null === $highestPriority) { + $highestPriority = $item['priority']; + $keyToRemove = $key; + continue; + } + + if ($highestPriority >= $item['priority']) { + continue; + } + + $highestPriority = $item['priority']; + $keyToRemove = $key; + } + + if ($keyToRemove !== null) { + unset($this->items[$keyToRemove]); + } + + return $value; + } + + /** + * Retrieve the inner iterator + * + * SplPriorityQueue acts as a heap, which typically implies that as items + * are iterated, they are also removed. This does not work for situations + * where the queue may be iterated multiple times. As such, this class + * aggregates the values, and also injects an SplPriorityQueue. This method + * retrieves the inner queue object, and clones it for purposes of + * iteration. + * + * @return \SplPriorityQueue + */ + #[ReturnTypeWillChange] + public function getIterator() + { + $queue = $this->getQueue(); + return clone $queue; + } + + /** + * Serialize the data structure + * + * @return string + */ + public function serialize() + { + return serialize($this->__serialize()); + } + + /** + * Magic method used for serializing of an instance. + * + * @return list + */ + public function __serialize() + { + return $this->items; + } + + /** + * Unserialize a string into a PriorityQueue object + * + * Serialization format is compatible with {@link SplPriorityQueue} + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + $toUnserialize = unserialize($data); + if (! is_array($toUnserialize)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance; corrupt serialization data', + self::class + )); + } + + /** @psalm-var list $toUnserialize */ + + $this->__unserialize($toUnserialize); + } + + /** + * Magic method used to rebuild an instance. + * + * @param list $data Data array. + * @return void + */ + public function __unserialize($data) + { + foreach ($data as $item) { + $this->insert($item['data'], $item['priority']); + } + } + + /** + * Serialize to an array + * By default, returns only the item data, and in the order registered (not + * sorted). You may provide one of the EXTR_* flags as an argument, allowing + * the ability to return priorities or both data and priority. + * + * @param int $flag + * @return array + * @psalm-return ($flag is self::EXTR_BOTH + * ? list + * : $flag is self::EXTR_PRIORITY + * ? list + * : list + * ) + */ + public function toArray($flag = self::EXTR_DATA) + { + return match ($flag) { + self::EXTR_BOTH => $this->items, + self::EXTR_PRIORITY => array_map(static fn($item): int => $item['priority'], $this->items), + default => array_map(static fn($item): mixed => $item['data'], $this->items), + }; + } + + /** + * Specify the internal queue class + * + * Please see {@link getIterator()} for details on the necessity of an + * internal queue class. The class provided should extend SplPriorityQueue. + * + * @param class-string<\SplPriorityQueue> $class + * @return $this + */ + public function setInternalQueueClass($class) + { + /** @psalm-suppress RedundantCastGivenDocblockType */ + $this->queueClass = (string) $class; + return $this; + } + + /** + * Does the queue contain the given datum? + * + * @param TValue $datum + * @return bool + */ + public function contains($datum) + { + foreach ($this->items as $item) { + if ($item['data'] === $datum) { + return true; + } + } + return false; + } + + /** + * Does the queue have an item with the given priority? + * + * @param TPriority $priority + * @return bool + */ + public function hasPriority($priority) + { + foreach ($this->items as $item) { + if ($item['priority'] === $priority) { + return true; + } + } + return false; + } + + /** + * Get the inner priority queue instance + * + * @throws Exception\DomainException + * @return \SplPriorityQueue + * @psalm-assert !null $this->queue + */ + protected function getQueue() + { + if (null === $this->queue) { + /** @psalm-suppress UnsafeInstantiation */ + $queue = new $this->queueClass(); + /** @psalm-var \SplPriorityQueue $queue */ + $this->queue = $queue; + /** @psalm-suppress DocblockTypeContradiction */ + if (! $this->queue instanceof \SplPriorityQueue) { + throw new Exception\DomainException(sprintf( + 'PriorityQueue expects an internal queue of type SplPriorityQueue; received "%s"', + $queue::class + )); + } + } + + return $this->queue; + } + + /** + * Add support for deep cloning + * + * @return void + */ + public function __clone() + { + if (null !== $this->queue) { + $this->queue = clone $this->queue; + } + } +} diff --git a/vendor/laminas/laminas-stdlib/src/Request.php b/vendor/laminas/laminas-stdlib/src/Request.php new file mode 100644 index 00000000..65026f60 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/Request.php @@ -0,0 +1,10 @@ + + */ +class SplPriorityQueue extends \SplPriorityQueue implements Serializable +{ + /** @var int Seed used to ensure queue order for items of the same priority */ + protected $serial = PHP_INT_MAX; + + /** + * Insert a value with a given priority + * + * Utilizes {@var $serial} to ensure that values of equal priority are + * emitted in the same order in which they are inserted. + * + * @param TValue $value + * @param TPriority $priority + * @return void + */ + #[ReturnTypeWillChange] // Inherited return type should be bool + public function insert($value, $priority) + { + if (! is_array($priority)) { + $priority = [$priority, $this->serial--]; + } + + parent::insert($value, $priority); + } + + /** + * Serialize to an array + * + * Array will be priority => data pairs + * + * @return list + */ + public function toArray() + { + $array = []; + foreach (clone $this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + public function serialize() + { + return serialize($this->__serialize()); + } + + /** + * Magic method used for serializing of an instance. + * + * @return array + */ + public function __serialize() + { + $clone = clone $this; + $clone->setExtractFlags(self::EXTR_BOTH); + + $data = []; + foreach ($clone as $item) { + $data[] = $item; + } + return $data; + } + + /** + * Deserialize + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + $toUnserialize = unserialize($data); + if (! is_array($toUnserialize)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance; corrupt serialization data', + self::class + )); + } + + $this->__unserialize($toUnserialize); + } + + /** + * Magic method used to rebuild an instance. + * + * @param array $data Data array. + * @return void + */ + public function __unserialize($data) + { + $this->serial = PHP_INT_MAX; + + foreach ($data as $item) { + if (! is_array($item)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance: corrupt item; expected array, received %s', + self::class, + get_debug_type($item) + )); + } + + if (! array_key_exists('data', $item)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance: corrupt item; missing "data" element', + self::class + )); + } + + $priority = 1; + if (array_key_exists('priority', $item)) { + $priority = (int) $item['priority']; + } + + $this->insert($item['data'], $priority); + } + } +} diff --git a/vendor/laminas/laminas-stdlib/src/SplQueue.php b/vendor/laminas/laminas-stdlib/src/SplQueue.php new file mode 100644 index 00000000..2656a856 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/SplQueue.php @@ -0,0 +1,94 @@ + + */ +class SplQueue extends \SplQueue implements Serializable +{ + /** + * Return an array representing the queue + * + * @return list + */ + public function toArray() + { + $array = []; + foreach ($this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + #[ReturnTypeWillChange] + public function serialize() + { + return serialize($this->__serialize()); + } + + /** + * Magic method used for serializing of an instance. + * + * @return list + */ + #[ReturnTypeWillChange] + public function __serialize() + { + return $this->toArray(); + } + + /** + * Unserialize + * + * @param string $data + * @return void + */ + #[ReturnTypeWillChange] + public function unserialize($data) + { + $toUnserialize = unserialize($data); + if (! is_array($toUnserialize)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance; corrupt serialization data', + self::class + )); + } + + $this->__unserialize($toUnserialize); + } + + /** + * Magic method used to rebuild an instance. + * + * @param array $data Data array. + * @return void + */ + #[ReturnTypeWillChange] + public function __unserialize($data) + { + foreach ($data as $item) { + $this->push($item); + } + } +} diff --git a/vendor/laminas/laminas-stdlib/src/SplStack.php b/vendor/laminas/laminas-stdlib/src/SplStack.php new file mode 100644 index 00000000..52564fde --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/SplStack.php @@ -0,0 +1,93 @@ + + */ +class SplStack extends \SplStack implements Serializable +{ + /** + * Serialize to an array representing the stack + * + * @return list + */ + public function toArray() + { + $array = []; + foreach ($this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + #[ReturnTypeWillChange] + public function serialize() + { + return serialize($this->__serialize()); + } + + /** + * Magic method used for serializing of an instance. + * + * @return list + */ + #[ReturnTypeWillChange] + public function __serialize() + { + return $this->toArray(); + } + + /** + * Unserialize + * + * @param string $data + * @return void + */ + #[ReturnTypeWillChange] + public function unserialize($data) + { + $toUnserialize = unserialize($data); + if (! is_array($toUnserialize)) { + throw new UnexpectedValueException(sprintf( + 'Cannot deserialize %s instance; corrupt serialization data', + self::class + )); + } + + $this->__unserialize($toUnserialize); + } + + /** + * Magic method used to rebuild an instance. + * + * @param array $data Data array. + * @return void + */ + #[ReturnTypeWillChange] + public function __unserialize($data) + { + foreach ($data as $item) { + $this->unshift($item); + } + } +} diff --git a/vendor/laminas/laminas-stdlib/src/StringUtils.php b/vendor/laminas/laminas-stdlib/src/StringUtils.php new file mode 100644 index 00000000..ffc3ad55 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/StringUtils.php @@ -0,0 +1,213 @@ +>|null + */ + protected static $wrapperRegistry; + + /** + * A list of known single-byte character encodings (upper-case) + * + * @var string[] + */ + protected static $singleByteEncodings = [ + 'ASCII', + '7BIT', + '8BIT', + 'ISO-8859-1', + 'ISO-8859-2', + 'ISO-8859-3', + 'ISO-8859-4', + 'ISO-8859-5', + 'ISO-8859-6', + 'ISO-8859-7', + 'ISO-8859-8', + 'ISO-8859-9', + 'ISO-8859-10', + 'ISO-8859-11', + 'ISO-8859-13', + 'ISO-8859-14', + 'ISO-8859-15', + 'ISO-8859-16', + 'CP-1251', + 'CP-1252', + // TODO + ]; + + /** + * Is PCRE compiled with Unicode support? + * + * @var bool + **/ + protected static $hasPcreUnicodeSupport; + + /** + * Get registered wrapper classes + * + * @return string[] + * @psalm-return list> + */ + public static function getRegisteredWrappers() + { + if (static::$wrapperRegistry === null) { + static::$wrapperRegistry = []; + + if (extension_loaded('intl')) { + static::$wrapperRegistry[] = Intl::class; + } + + if (extension_loaded('mbstring')) { + static::$wrapperRegistry[] = MbString::class; + } + + if (extension_loaded('iconv')) { + static::$wrapperRegistry[] = Iconv::class; + } + + static::$wrapperRegistry[] = Native::class; + } + + return static::$wrapperRegistry; + } + + /** + * Register a string wrapper class + * + * @param class-string $wrapper + * @return void + */ + public static function registerWrapper($wrapper) + { + $wrapper = (string) $wrapper; + // using getRegisteredWrappers() here to ensure that the list is initialized + if (! in_array($wrapper, static::getRegisteredWrappers(), true)) { + static::$wrapperRegistry[] = $wrapper; + } + } + + /** + * Unregister a string wrapper class + * + * @param class-string $wrapper + * @return void + */ + public static function unregisterWrapper($wrapper) + { + // using getRegisteredWrappers() here to ensure that the list is initialized + $index = array_search((string) $wrapper, static::getRegisteredWrappers(), true); + if ($index !== false) { + unset(static::$wrapperRegistry[$index]); + } + } + + /** + * Reset all registered wrappers so the default wrappers will be used + * + * @return void + */ + public static function resetRegisteredWrappers() + { + static::$wrapperRegistry = null; + } + + /** + * Get the first string wrapper supporting the given character encoding + * and supports to convert into the given convert encoding. + * + * @param string $encoding Character encoding to support + * @param string|null $convertEncoding OPTIONAL character encoding to convert in + * @return StringWrapperInterface + * @throws Exception\RuntimeException If no wrapper supports given character encodings. + */ + public static function getWrapper($encoding = 'UTF-8', $convertEncoding = null) + { + foreach (static::getRegisteredWrappers() as $wrapperClass) { + if ($wrapperClass::isSupported($encoding, $convertEncoding)) { + $wrapper = new $wrapperClass($encoding, $convertEncoding); + $wrapper->setEncoding($encoding, $convertEncoding); + return $wrapper; + } + } + + throw new Exception\RuntimeException( + 'No wrapper found supporting "' . $encoding . '"' + . ($convertEncoding !== null ? ' and "' . $convertEncoding . '"' : '') + ); + } + + /** + * Get a list of all known single-byte character encodings + * + * @return string[] + */ + public static function getSingleByteEncodings() + { + return static::$singleByteEncodings; + } + + /** + * Check if a given encoding is a known single-byte character encoding + * + * @param string $encoding + * @return bool + */ + public static function isSingleByteEncoding($encoding) + { + return in_array(strtoupper($encoding), static::$singleByteEncodings); + } + + /** + * Check if a given string is valid UTF-8 encoded + * + * @param string $str + * @return bool + */ + public static function isValidUtf8($str) + { + return is_string($str) && ($str === '' || preg_match('/^./su', $str) === 1); + } + + /** + * Is PCRE compiled with Unicode support? + * + * @return bool + */ + public static function hasPcreUnicodeSupport() + { + if (static::$hasPcreUnicodeSupport === null) { + ErrorHandler::start(); + static::$hasPcreUnicodeSupport = defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') === 1; + ErrorHandler::stop(); + } + return static::$hasPcreUnicodeSupport; + } +} diff --git a/vendor/laminas/laminas-stdlib/src/StringWrapper/AbstractStringWrapper.php b/vendor/laminas/laminas-stdlib/src/StringWrapper/AbstractStringWrapper.php new file mode 100644 index 00000000..a96c7a46 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/StringWrapper/AbstractStringWrapper.php @@ -0,0 +1,278 @@ +convertEncoding = $convertEncodingUpper; + } else { + $this->convertEncoding = null; + } + $this->encoding = $encodingUpper; + + return $this; + } + + /** + * Get the defined character encoding to work with + * + * @return null|string + * @throws Exception\LogicException If no encoding was defined. + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Get the defined character encoding to convert to + * + * @return string|null + */ + public function getConvertEncoding() + { + return $this->convertEncoding; + } + + /** + * Convert a string from defined character encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false) + { + $encoding = $this->getEncoding(); + $convertEncoding = $this->getConvertEncoding(); + if ($convertEncoding === null) { + throw new Exception\LogicException( + 'No convert encoding defined' + ); + } + + if ($encoding === $convertEncoding) { + return $str; + } + + $from = $reverse ? $convertEncoding : $encoding; + $to = $reverse ? $encoding : $convertEncoding; + throw new Exception\RuntimeException(sprintf( + 'Converting from "%s" to "%s" isn\'t supported by this string wrapper', + $from ?? '', + $to ?? '' + )); + } + + /** + * Wraps a string to a given number of characters + * + * @param string $string + * @param int $width + * @param string $break + * @param bool $cut + * @return string|false + */ + public function wordWrap($string, $width = 75, $break = "\n", $cut = false) + { + $string = (string) $string; + if ($string === '') { + return ''; + } + + $break = (string) $break; + if ($break === '') { + throw new Exception\InvalidArgumentException('Break string cannot be empty'); + } + + $width = (int) $width; + if ($width === 0 && $cut) { + throw new Exception\InvalidArgumentException('Cannot force cut when width is zero'); + } + + if (null === $this->getEncoding() || StringUtils::isSingleByteEncoding($this->getEncoding())) { + return wordwrap($string, $width, $break, $cut); + } + + $stringWidth = $this->strlen($string); + $breakWidth = $this->strlen($break); + + $result = ''; + $lastStart = $lastSpace = 0; + + for ($current = 0; $current < $stringWidth; $current++) { + $char = $this->substr($string, $current, 1); + + $possibleBreak = $char; + if ($breakWidth !== 1) { + $possibleBreak = $this->substr($string, $current, $breakWidth); + } + + if ($possibleBreak === $break) { + $result .= $this->substr($string, $lastStart, $current - $lastStart + $breakWidth); + $current += $breakWidth - 1; + $lastStart = $lastSpace = $current + 1; + continue; + } + + if ($char === ' ') { + if ($current - $lastStart >= $width) { + $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break; + $lastStart = $current + 1; + } + + $lastSpace = $current; + continue; + } + + if ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) { + $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break; + $lastStart = $lastSpace = $current; + continue; + } + + if ($current - $lastStart >= $width && $lastStart < $lastSpace) { + $result .= $this->substr($string, $lastStart, $lastSpace - $lastStart) . $break; + $lastStart = $lastSpace += 1; + continue; + } + } + + if ($lastStart !== $current) { + $result .= $this->substr($string, $lastStart, $current - $lastStart); + } + + return $result; + } + + /** + * Pad a string to a certain length with another string + * + * @param string $input + * @param int $padLength + * @param string $padString + * @param int $padType + * @return string + */ + public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT) + { + if (null === $this->getEncoding() || StringUtils::isSingleByteEncoding($this->getEncoding())) { + return str_pad($input, $padLength, $padString, $padType); + } + + $lengthOfPadding = $padLength - $this->strlen($input); + if ($lengthOfPadding <= 0) { + return $input; + } + + $padStringLength = $this->strlen($padString); + if ($padStringLength === 0) { + return $input; + } + + $repeatCount = (int) floor($lengthOfPadding / $padStringLength); + + if ($padType === STR_PAD_BOTH) { + $repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2; + + $lastStringLength = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength; + $lastStringLeftLength = $lastStringRightLength = (int) floor($lastStringLength / 2); + $lastStringRightLength += $lastStringLength % 2; + + $lastStringLeft = $this->substr($padString, 0, $lastStringLeftLength); + $lastStringRight = $this->substr($padString, 0, $lastStringRightLength); + + return str_repeat($padString, $repeatCountLeft) . $lastStringLeft + . $input + . str_repeat($padString, $repeatCountRight) . $lastStringRight; + } + + $lastString = $this->substr($padString, 0, $lengthOfPadding % $padStringLength); + + if ($padType === STR_PAD_LEFT) { + return str_repeat($padString, $repeatCount) . $lastString . $input; + } + + return $input . str_repeat($padString, $repeatCount) . $lastString; + } +} diff --git a/vendor/laminas/laminas-stdlib/src/StringWrapper/Iconv.php b/vendor/laminas/laminas-stdlib/src/StringWrapper/Iconv.php new file mode 100644 index 00000000..2f52b74e --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/StringWrapper/Iconv.php @@ -0,0 +1,302 @@ +getEncoding()); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + $length ??= $this->strlen($str); + assert($length !== false); + + return iconv_substr($str, $offset, $length, $this->getEncoding()); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + $encoding = $this->getEncoding(); + assert($encoding !== null); + + return iconv_strpos($haystack, $needle, $offset, $encoding); + } + + /** + * Convert a string from defined encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false) + { + $encoding = $this->getEncoding(); + $convertEncoding = $this->getConvertEncoding(); + if ($convertEncoding === null) { + throw new Exception\LogicException( + 'No convert encoding defined' + ); + } + + if ($encoding === $convertEncoding) { + return $str; + } + + $fromEncoding = $reverse ? $convertEncoding : $encoding; + $toEncoding = $reverse ? $encoding : $convertEncoding; + + if (null === $toEncoding || null === $fromEncoding) { + return $str; + } + + // automatically add "//IGNORE" to not stop converting on invalid characters + // invalid characters triggers a notice anyway + return iconv($fromEncoding, $toEncoding . '//IGNORE', $str); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/StringWrapper/Intl.php b/vendor/laminas/laminas-stdlib/src/StringWrapper/Intl.php new file mode 100644 index 00000000..81a6b9a8 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/StringWrapper/Intl.php @@ -0,0 +1,89 @@ +getEncoding()); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + return mb_substr($str, $offset, $length, $this->getEncoding()); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + return mb_strpos($haystack, $needle, $offset, $this->getEncoding()); + } + + /** + * Convert a string from defined encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false) + { + $encoding = $this->getEncoding(); + $convertEncoding = $this->getConvertEncoding(); + + if ($convertEncoding === null) { + throw new Exception\LogicException( + 'No convert encoding defined' + ); + } + + if ($encoding === $convertEncoding) { + return $str; + } + + $fromEncoding = $reverse ? $convertEncoding : $encoding; + $toEncoding = $reverse ? $encoding : $convertEncoding; + + return mb_convert_encoding($str, $toEncoding ?? '', $fromEncoding ?? ''); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/StringWrapper/Native.php b/vendor/laminas/laminas-stdlib/src/StringWrapper/Native.php new file mode 100644 index 00000000..a137d4ae --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/StringWrapper/Native.php @@ -0,0 +1,135 @@ +convertEncoding = $encodingUpper; + } + + if ($convertEncoding !== null) { + if ($encodingUpper !== strtoupper($convertEncoding)) { + throw new Exception\InvalidArgumentException( + 'Wrapper doesn\'t support to convert between character encodings' + ); + } + + $this->convertEncoding = $encodingUpper; + } else { + $this->convertEncoding = null; + } + $this->encoding = $encodingUpper; + + return $this; + } + + /** + * Returns the length of the given string + * + * @param string $str + * @return int|false + */ + public function strlen($str) + { + return strlen($str); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + return substr($str, $offset, $length); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + return strpos($haystack, $needle, $offset); + } +} diff --git a/vendor/laminas/laminas-stdlib/src/StringWrapper/StringWrapperInterface.php b/vendor/laminas/laminas-stdlib/src/StringWrapper/StringWrapperInterface.php new file mode 100644 index 00000000..700799f9 --- /dev/null +++ b/vendor/laminas/laminas-stdlib/src/StringWrapper/StringWrapperInterface.php @@ -0,0 +1,108 @@ + ## 🇷🇺 Русским гражданам +> +> Мы, участники Laminas, родились и живем в разных странах. У многих из нас есть друзья, родственники и коллеги как в России, так и в Украине. Некоторые из нас родились в России. Некоторые из нас живут в России. У некоторых бабушки и дедушки сражались с фашистами во Второй мировой войне. Здесь никто не поддерживает фашизм. +> +> У одного из нас есть украинская родственница, которая спаслась из дома вместе с сыном. Поезд задержался из-за бомбежки на дороге впереди. У нас есть друзья, которые прячутся в бомбоубежищах. Мы с тревогой ждем весточки от них после воздушных налетов, которые беспорядочно наносят удары и попадают по больницам, школам, детским садам и домам. Мы не берем это из каких-либо СМИ. Мы наблюдаем это напрямую. +> +> Вы доверяете нам достаточно, чтоб использовать наши программы, и мы просим вас довериться нам вновь. Мы нуждаемся в помощи. Выходите и протестуйте против этой бесполезной войны. Остановите кровопролитие. Скажите "Нет войне!" +> +> ## 🇺🇸 To Citizens of Russia +> +> We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism. +> +> One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences. +> +> You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!" + +laminas-validator provides a set of commonly needed validators. It also provides a +simple validator chaining mechanism by which multiple validators may be applied +to a single datum in a user-defined order. + +## Installation + +Run the following to install this library: + +```bash +$ composer require laminas/laminas-validator +``` + +## Documentation + +Browse the documentation online at https://docs.laminas.dev/laminas-validator/ + +## Support + +* [Issues](https://github.com/laminas/laminas-validator/issues/) +* [Chat](https://laminas.dev/chat/) +* [Forum](https://discourse.laminas.dev/) diff --git a/vendor/laminas/laminas-validator/composer.json b/vendor/laminas/laminas-validator/composer.json new file mode 100644 index 00000000..d309db5e --- /dev/null +++ b/vendor/laminas/laminas-validator/composer.json @@ -0,0 +1,86 @@ +{ + "name": "laminas/laminas-validator", + "description": "Validation classes for a wide range of domains, and the ability to chain validators to create complex validation criteria", + "license": "BSD-3-Clause", + "keywords": [ + "laminas", + "validator" + ], + "homepage": "https://laminas.dev", + "support": { + "docs": "https://docs.laminas.dev/laminas-validator/", + "issues": "https://github.com/laminas/laminas-validator/issues", + "source": "https://github.com/laminas/laminas-validator", + "rss": "https://github.com/laminas/laminas-validator/releases.atom", + "chat": "https://laminas.dev/chat", + "forum": "https://discourse.laminas.dev" + }, + "config": { + "sort-packages": true, + "platform": { + "php": "8.1.99" + }, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "extra": { + "laminas": { + "component": "Laminas\\Validator", + "config-provider": "Laminas\\Validator\\ConfigProvider" + } + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "laminas/laminas-servicemanager": "^3.21.0", + "laminas/laminas-stdlib": "^3.19", + "psr/http-message": "^1.0.1 || ^2.0.0" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "laminas/laminas-db": "^2.20", + "laminas/laminas-filter": "^2.35.2", + "laminas/laminas-i18n": "^2.26.0", + "laminas/laminas-session": "^2.20", + "laminas/laminas-uri": "^2.11.0", + "phpunit/phpunit": "^10.5.20", + "psalm/plugin-phpunit": "^0.19.0", + "psr/http-client": "^1.0.3", + "psr/http-factory": "^1.1.0", + "vimeo/psalm": "^5.24.0" + }, + "suggest": { + "laminas/laminas-db": "Laminas\\Db component, required by the (No)RecordExists validator", + "laminas/laminas-filter": "Laminas\\Filter component, required by the Digits validator", + "laminas/laminas-i18n": "Laminas\\I18n component to allow translation of validation error messages", + "laminas/laminas-i18n-resources": "Translations of validator messages", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "laminas/laminas-session": "Laminas\\Session component, ^2.8; required by the Csrf validator", + "laminas/laminas-uri": "Laminas\\Uri component, required by the Uri and Sitemap\\Loc validators", + "psr/http-message": "psr/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators" + }, + "autoload": { + "psr-4": { + "Laminas\\Validator\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "LaminasTest\\Validator\\": "test/" + } + }, + "scripts": { + "check": [ + "@cs-check", + "@test" + ], + "cs-check": "phpcs", + "cs-fix": "phpcbf", + "test": "phpunit --colors=always", + "test-coverage": "phpunit --colors=always --coverage-clover clover.xml", + "static-analysis": "psalm --shepherd --stats" + }, + "conflict": { + "zendframework/zend-validator": "*" + } +} diff --git a/vendor/laminas/laminas-validator/renovate.json b/vendor/laminas/laminas-validator/renovate.json new file mode 100644 index 00000000..060b1d1a --- /dev/null +++ b/vendor/laminas/laminas-validator/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "local>laminas/.github:renovate-config" + ] +} diff --git a/vendor/laminas/laminas-validator/src/AbstractValidator.php b/vendor/laminas/laminas-validator/src/AbstractValidator.php new file mode 100644 index 00000000..6dd45d17 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/AbstractValidator.php @@ -0,0 +1,662 @@ +, + * messageTemplates: array, + * messageVariables: array, + * translator: Translator\TranslatorInterface|null, + * translatorTextDomain: string|null, + * translatorEnabled: bool, + * valueObscured: bool, + * } + * @property array $options + * @property array $messageTemplates + * @property array $messageVariables + */ +abstract class AbstractValidator implements + Translator\TranslatorAwareInterface, + ValidatorInterface +{ + /** + * The value to be validated + * + * @var mixed + */ + protected $value; + + /** + * Default translation object for all validate objects + * + * @var Translator\TranslatorInterface + */ + protected static $defaultTranslator; + + /** + * Default text domain to be used with translator + * + * @var string + */ + protected static $defaultTranslatorTextDomain = 'default'; + + /** + * Limits the maximum returned length of an error message + * + * @var int + */ + protected static $messageLength = -1; + /** + * @deprecated Since 2.61.0 This property will be removed in 3.0 + * + * @var AbstractOptions&array + */ + protected $abstractOptions = [ + 'messages' => [], // Array of validation failure messages + 'messageTemplates' => [], // Array of validation failure message templates + 'messageVariables' => [], // Array of additional variables available for validation failure messages + 'translator' => null, // Translation object to used -> Translator\TranslatorInterface + 'translatorTextDomain' => null, // Translation text domain + 'translatorEnabled' => true, // Is translation enabled? + 'valueObscured' => false, // Flag indicating whether value should be obfuscated in error messages + ]; + + /** + * Abstract constructor for all validators + * A validator should accept following parameters: + * - nothing f.e. Validator() + * - one or multiple scalar values f.e. Validator($first, $second, $third) + * - an array f.e. Validator(array($first => 'first', $second => 'second', $third => 'third')) + * - an instance of Traversable f.e. Validator($config_instance) + * + * @param array|Traversable $options + */ + public function __construct($options = null) + { + // The abstract constructor allows no scalar values + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + /** @psalm-suppress RedundantConditionGivenDocblockType */ + if (isset($this->messageTemplates) && is_array($this->messageTemplates)) { + $this->abstractOptions['messageTemplates'] = $this->messageTemplates; + } + + /** @psalm-suppress RedundantConditionGivenDocblockType */ + if (isset($this->messageVariables) && is_array($this->messageVariables)) { + $this->abstractOptions['messageVariables'] = $this->messageVariables; + } + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Returns an option + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @param string $option Option to be returned + * @return mixed Returned option + * @throws Exception\InvalidArgumentException + */ + public function getOption($option) + { + if (array_key_exists($option, $this->abstractOptions)) { + return $this->abstractOptions[$option]; + } + + /** @psalm-suppress RedundantConditionGivenDocblockType */ + if (isset($this->options) && array_key_exists($option, $this->options)) { + return $this->options[$option]; + } + + throw new Exception\InvalidArgumentException("Invalid option '$option'"); + } + + /** + * Returns all available options + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return array Array with all available options + */ + public function getOptions() + { + $result = $this->abstractOptions; + /** @psalm-suppress RedundantConditionGivenDocblockType */ + if (isset($this->options) && is_array($this->options)) { + $result += $this->options; + } + return $result; + } + + /** + * Sets one or multiple options + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 - Options should be passed to the constructor + * + * @param array|Traversable $options Options to set + * @return self Provides fluid interface + * @throws Exception\InvalidArgumentException If $options is not an array or Traversable. + */ + public function setOptions($options = []) + { + /** @psalm-suppress DocblockTypeContradiction */ + if (! is_array($options) && ! $options instanceof Traversable) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable'); + } + + /** + * @psalm-suppress RedundantConditionGivenDocblockType + * @psalm-var mixed $option + */ + foreach ($options as $name => $option) { + $fname = 'set' . ucfirst($name); + $fname2 = 'is' . ucfirst($name); + if (($name !== 'setOptions') && method_exists($this, $name)) { + $this->{$name}($option); + } elseif (($fname !== 'setOptions') && method_exists($this, $fname)) { + $this->{$fname}($option); + } elseif (method_exists($this, $fname2)) { + $this->{$fname2}($option); + } elseif (isset($this->options) && is_array($this->options)) { + $this->options[$name] = $option; + } else { + $this->abstractOptions[$name] = $option; + } + } + + return $this; + } + + /** + * Returns array of validation failure messages + * + * @return array + */ + public function getMessages() + { + return array_unique($this->abstractOptions['messages'], SORT_REGULAR); + } + + /** + * Invoke as command + * + * @return bool + */ + public function __invoke(mixed $value) + { + return $this->isValid($value); + } + + /** + * Returns an array of the names of variables that are used in constructing validation failure messages + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return list + */ + public function getMessageVariables() + { + return array_keys($this->abstractOptions['messageVariables']); + } + + /** + * Returns the message templates from the validator + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return array + */ + public function getMessageTemplates() + { + return $this->abstractOptions['messageTemplates']; + } + + /** + * Sets the validation failure message template for a particular key + * + * @param string $messageString + * @param string|null $messageKey OPTIONAL + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setMessage($messageString, $messageKey = null) + { + if ($messageKey === null) { + $keys = array_keys($this->abstractOptions['messageTemplates']); + foreach ($keys as $key) { + $this->setMessage($messageString, $key); + } + return $this; + } + + if (! isset($this->abstractOptions['messageTemplates'][$messageKey])) { + throw new Exception\InvalidArgumentException("No message template exists for key '$messageKey'"); + } + + $this->abstractOptions['messageTemplates'][$messageKey] = $messageString; + return $this; + } + + /** + * Sets validation failure message templates given as an array, where the array keys are the message keys, + * and the array values are the message template strings. + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * Provide customised messages via the `messages` constructor option + * + * @param array $messages + * @return $this + */ + public function setMessages(array $messages) + { + foreach ($messages as $key => $message) { + $this->setMessage($message, $key); + } + return $this; + } + + /** + * Magic function returns the value of the requested property, if and only if it is the value or a + * message variable. + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 - It will no longer be possible to fetch any internal + * properties + * + * @param string $property + * @return mixed + * @throws Exception\InvalidArgumentException + */ + public function __get($property) + { + if ($property === 'value') { + return $this->value; + } + + if (array_key_exists($property, $this->abstractOptions['messageVariables'])) { + /** @psalm-var mixed $result */ + $result = $this->abstractOptions['messageVariables'][$property]; + if (is_array($result)) { + return $this->{key($result)}[current($result)]; + } + return $this->{$result}; + } + + /** @psalm-suppress RedundantConditionGivenDocblockType */ + if (isset($this->messageVariables) && array_key_exists($property, $this->messageVariables)) { + /** @psalm-var mixed $result */ + $result = $this->{$this->messageVariables[$property]}; + if (is_array($result)) { + return $this->{key($result)}[current($result)]; + } + return $this->{$result}; + } + + throw new Exception\InvalidArgumentException("No property exists by the name '$property'"); + } + + /** + * Constructs and returns a validation failure message with the given message key and value. + * + * Returns null if and only if $messageKey does not correspond to an existing template. + * + * If a translator is available and a translation exists for $messageKey, + * the translation will be used. + * + * @param string $messageKey + * @param string|array|object $value + * @return null|string + */ + protected function createMessage($messageKey, $value) + { + if (! isset($this->abstractOptions['messageTemplates'][$messageKey])) { + return null; + } + + $message = $this->abstractOptions['messageTemplates'][$messageKey]; + + $message = $this->translateMessage($messageKey, $message); + + if (is_object($value)) { + $value = method_exists($value, '__toString') + ? (string) $value + : $value::class . ' object'; + } elseif (is_array($value)) { + $value = var_export($value, true); + } else { + /** @psalm-suppress RedundantCastGivenDocblockType $value */ + $value = (string) $value; + } + + if ($this->isValueObscured()) { + $value = str_repeat('*', strlen($value)); + } + + $message = str_replace('%value%', $value, $message); + foreach ($this->abstractOptions['messageVariables'] as $ident => $property) { + if (is_array($property)) { + $value = $this->{key($property)}[current($property)]; + if (is_array($value)) { + $value = '[' . implode(', ', $value) . ']'; + } + } else { + $value = $this->$property; + } + $message = str_replace("%$ident%", (string) $value, $message); + } + + $length = self::getMessageLength(); + if (($length > -1) && (strlen($message) > $length)) { + $message = substr($message, 0, $length - 3) . '...'; + } + + return $message; + } + + /** + * @param string|null $messageKey + * @param null|string|array|object $value OPTIONAL + * @return void + */ + protected function error($messageKey, $value = null) + { + if ($messageKey === null) { + $keys = array_keys($this->abstractOptions['messageTemplates']); + $messageKey = current($keys); + } + + if ($value === null) { + /** @psalm-var string|array|object $value */ + $value = $this->value; + } + + $message = $this->createMessage($messageKey, $value); + if (! is_string($message)) { + return; + } + + $this->abstractOptions['messages'][$messageKey] = $message; + } + + /** + * Returns the validation value + * + * @return mixed Value to be validated + */ + protected function getValue() + { + return $this->value; + } + + /** + * Sets the value to be validated and clears the messages and errors arrays + * + * @return void + */ + protected function setValue(mixed $value) + { + $this->value = $value; + $this->abstractOptions['messages'] = []; + } + + /** + * Set flag indicating whether or not value should be obfuscated in messages + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 - Use the `valueObscured` option via the constructor + * + * @param bool $flag + * @return $this + */ + public function setValueObscured($flag) + { + /** @psalm-suppress RedundantCastGivenDocblockType */ + $this->abstractOptions['valueObscured'] = (bool) $flag; + return $this; + } + + /** + * Retrieve flag indicating whether or not value should be obfuscated in + * messages + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return bool + */ + public function isValueObscured() + { + return $this->abstractOptions['valueObscured']; + } + + /** + * Set translation object + * + * @param string $textDomain (optional) + * @return $this + * @throws Exception\InvalidArgumentException + */ + public function setTranslator(?Translator\TranslatorInterface $translator = null, $textDomain = null) + { + $this->abstractOptions['translator'] = $translator; + if (null !== $textDomain) { + $this->setTranslatorTextDomain($textDomain); + } + return $this; + } + + /** + * Return translation object + * + * @return Translator\TranslatorInterface|null + */ + public function getTranslator() + { + if (! $this->isTranslatorEnabled()) { + return null; + } + + if (null === $this->abstractOptions['translator']) { + $this->abstractOptions['translator'] = self::getDefaultTranslator(); + } + + return $this->abstractOptions['translator']; + } + + /** + * Does this validator have its own specific translator? + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return bool + */ + public function hasTranslator() + { + return (bool) $this->abstractOptions['translator']; + } + + /** + * Set translation text domain + * + * @deprecated since 2.61.0 This method will be removed in 3.0 Use the `translatorTextDomain` option, or set + * the text domain at the same time as the translator via `setTranslator()` + * + * @param string $textDomain + * @return $this + */ + public function setTranslatorTextDomain($textDomain = 'default') + { + $this->abstractOptions['translatorTextDomain'] = $textDomain; + return $this; + } + + /** + * Return the translation text domain + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return string + */ + public function getTranslatorTextDomain() + { + if (null === $this->abstractOptions['translatorTextDomain']) { + $this->abstractOptions['translatorTextDomain'] = + self::getDefaultTranslatorTextDomain(); + } + return $this->abstractOptions['translatorTextDomain']; + } + + /** + * Set default translation object for all validate objects + * + * @param string $textDomain (optional) + * @return void + * @throws Exception\InvalidArgumentException + */ + public static function setDefaultTranslator(?Translator\TranslatorInterface $translator = null, $textDomain = null) + { + static::$defaultTranslator = $translator; + if (null !== $textDomain) { + self::setDefaultTranslatorTextDomain($textDomain); + } + } + + /** + * Get default translation object for all validate objects + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return Translator\TranslatorInterface|null + */ + public static function getDefaultTranslator() + { + return static::$defaultTranslator; + } + + /** + * Is there a default translation object set? + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return bool + */ + public static function hasDefaultTranslator() + { + return (bool) static::$defaultTranslator; + } + + /** + * Set default translation text domain for all validate objects + * + * @param string $textDomain + * @return void + */ + public static function setDefaultTranslatorTextDomain($textDomain = 'default') + { + static::$defaultTranslatorTextDomain = $textDomain; + } + + /** + * Get default translation text domain for all validate objects + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return string + */ + public static function getDefaultTranslatorTextDomain() + { + return static::$defaultTranslatorTextDomain; + } + + /** + * Indicate whether or not translation should be enabled + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @param bool $enabled + * @return $this + */ + public function setTranslatorEnabled($enabled = true) + { + /** @psalm-suppress RedundantCastGivenDocblockType */ + $this->abstractOptions['translatorEnabled'] = (bool) $enabled; + return $this; + } + + /** + * Is translation enabled? + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return bool + */ + public function isTranslatorEnabled() + { + return $this->abstractOptions['translatorEnabled']; + } + + /** + * Returns the maximum allowed message length + * + * @deprecated Since 2.61.0 This method will be removed in 3.0 + * + * @return int + */ + public static function getMessageLength() + { + return static::$messageLength; + } + + /** + * Sets the maximum allowed message length + * + * @param int $length + * @return void + */ + public static function setMessageLength($length = -1) + { + static::$messageLength = $length; + } + + /** + * Translate a validation message + * + * @param string $messageKey + * @param string $message + * @return string + */ + protected function translateMessage($messageKey, $message) + { + $translator = $this->getTranslator(); + if (! $translator) { + return $message; + } + + return $translator->translate($message, $this->getTranslatorTextDomain()); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode.php b/vendor/laminas/laminas-validator/src/Barcode.php new file mode 100644 index 00000000..20516a14 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode.php @@ -0,0 +1,220 @@ + */ + protected $messageTemplates = [ + self::FAILED => 'The input failed checksum validation', + self::INVALID_CHARS => 'The input contains invalid characters', + self::INVALID_LENGTH => 'The input should have a length of %length% characters', + self::INVALID => 'Invalid type given. String expected', + ]; + + /** + * Additional variables available for validation failure messages + * + * @var array> + */ + protected $messageVariables = [ + 'length' => ['options' => 'length'], + ]; + /** + * @var array{ + * adapter: null|AdapterInterface, + * options: null|array, + * length: null|int|array, + * useChecksum: null|bool, + * } + */ + protected $options = [ + 'adapter' => null, // Barcode adapter Laminas\Validator\Barcode\AbstractAdapter + 'options' => null, // Options for this adapter + 'length' => null, + 'useChecksum' => null, + ]; + + /** + * Constructor for barcodes + * + * @param iterable|null|string|AdapterInterface $options Options to use + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if ($options === null) { + $options = []; + } + + if (is_string($options) || $options instanceof AdapterInterface) { + $options = ['adapter' => $options]; + } + + if (! is_array($options)) { + throw new InvalidArgumentException(sprintf( + 'Options should be an array, a string representing the name of an adapter, or an adapter instance. ' + . 'Received "%s"', + get_debug_type($options), + )); + } + + parent::__construct($options); + } + + /** + * Returns the set adapter + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return AdapterInterface + */ + public function getAdapter() + { + if (! $this->options['adapter'] instanceof Barcode\AdapterInterface) { + $this->setAdapter('Ean13'); + } + + assert($this->options['adapter'] instanceof Barcode\AdapterInterface); + + return $this->options['adapter']; + } + + /** + * Sets a new barcode adapter + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param string|AdapterInterface $adapter Barcode adapter to use + * @param array $options Options for this adapter + * @return $this + * @throws InvalidArgumentException + */ + public function setAdapter($adapter, $options = null) + { + if (is_string($adapter)) { + $adapter = ucfirst(strtolower($adapter)); + $adapter = 'Laminas\\Validator\\Barcode\\' . $adapter; + + if (! class_exists($adapter)) { + throw new InvalidArgumentException('Barcode adapter matching "' . $adapter . '" not found'); + } + + $adapter = new $adapter($options); + } + + if (! $adapter instanceof Barcode\AdapterInterface) { + throw new InvalidArgumentException( + sprintf( + 'Adapter %s does not implement Laminas\\Validator\\Barcode\\AdapterInterface', + get_debug_type($adapter) + ) + ); + } + + $this->options['adapter'] = $adapter; + + return $this; + } + + /** + * Returns the checksum option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return string|null + */ + public function getChecksum() + { + return $this->getAdapter()->getChecksum(); + } + + /** + * Sets if checksum should be validated, if no value is given the actual setting is returned + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param null|bool $checksum + * @return AdapterInterface|bool + */ + public function useChecksum($checksum = null) + { + return $this->getAdapter()->useChecksum($checksum); + } + + /** + * Defined by Laminas\Validator\ValidatorInterface + * + * Returns true if and only if $value contains a valid barcode + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + $adapter = $this->getAdapter(); + $this->options['length'] = $adapter->getLength(); + $result = $adapter->hasValidLength($value); + if (! $result) { + if (is_array($this->options['length'])) { + $temp = $this->options['length']; + $this->options['length'] = ''; + foreach ($temp as $length) { + $this->options['length'] .= '/'; + $this->options['length'] .= $length; + } + + $this->options['length'] = substr($this->options['length'], 1); + } + + $this->error(self::INVALID_LENGTH); + return false; + } + + $result = $adapter->hasValidCharacters($value); + if (! $result) { + $this->error(self::INVALID_CHARS); + return false; + } + + if ($this->useChecksum(null)) { + $result = $adapter->hasValidChecksum($value); + if (! $result) { + $this->error(self::FAILED); + return false; + } + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/AbstractAdapter.php b/vendor/laminas/laminas-validator/src/Barcode/AbstractAdapter.php new file mode 100644 index 00000000..b2397adf --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/AbstractAdapter.php @@ -0,0 +1,317 @@ + null, // Allowed barcode lengths, integer, array, string + 'characters' => null, // Allowed barcode characters + 'checksum' => null, // Callback to checksum function + 'useChecksum' => true, // Is a checksum value included?, boolean + ]; + + /** + * Checks the length of a barcode + * + * @param string $value The barcode to check for proper length + * @return bool + */ + public function hasValidLength($value) + { + if (! is_string($value)) { + return false; + } + + $fixum = strlen($value); + $length = $this->getLength(); + + if (is_array($length)) { + foreach ($length as $value) { + if ($fixum === $value) { + return true; + } + + if ($value === -1) { + return true; + } + } + + return false; + } + + if ($fixum === $length) { + return true; + } + + if ($length === -1) { + return true; + } + + if ($length === 'even') { + $count = $fixum % 2; + return 0 === $count; + } + + if ($length === 'odd') { + $count = $fixum % 2; + return 1 === $count; + } + + return false; + } + + /** + * Checks for allowed characters within the barcode + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if (! is_string($value)) { + return false; + } + + $characters = $this->getCharacters(); + if ($characters === 128) { + for ($x = 0; $x < 128; ++$x) { + $value = str_replace(chr($x), '', $value); + } + } else { + $chars = str_split($characters); + foreach ($chars as $char) { + $value = str_replace($char, '', $value); + } + } + + if (strlen($value) > 0) { + return false; + } + + return true; + } + + /** + * Validates the checksum + * + * @param string $value The barcode to check the checksum for + * @return bool + */ + public function hasValidChecksum($value) + { + $checksum = $this->getChecksum(); + if ($checksum !== null) { + if (method_exists($this, $checksum)) { + return $this->$checksum($value); + } + } + + return false; + } + + /** + * Returns the allowed barcode length + * + * @return int|array|string|null + */ + public function getLength() + { + return $this->options['length']; + } + + /** + * Returns the allowed characters + * + * @return int|string|array|null + */ + public function getCharacters() + { + return $this->options['characters']; + } + + /** + * Returns the checksum function name + * + * @return string|null + */ + public function getChecksum() + { + return $this->options['checksum']; + } + + /** + * Sets the checksum validation method + * + * @param string $checksum Checksum method to call + * @return $this + */ + protected function setChecksum($checksum) + { + $this->options['checksum'] = $checksum; + return $this; + } + + /** + * Sets the checksum validation, if no value is given, the actual setting is returned + * + * @inheritDoc + */ + public function useChecksum($check = null) + { + if ($check === null) { + return $this->options['useChecksum']; + } + + $this->options['useChecksum'] = (bool) $check; + return $this; + } + + /** + * Sets the length of this barcode + * + * @param int|array $length + * @return $this + */ + protected function setLength($length) + { + $this->options['length'] = $length; + return $this; + } + + /** + * Sets the allowed characters of this barcode + * + * @param int|string|array $characters + * @return $this + */ + protected function setCharacters($characters) + { + $this->options['characters'] = $characters; + return $this; + } + + /** + * Validates the checksum (Modulo 10) + * GTIN implementation factor 3 + * + * @param string $value The barcode to validate + * @return bool + */ + protected function gtin($value) + { + $barcode = substr($value, 0, -1); + $sum = 0; + $length = strlen($barcode) - 1; + + for ($i = 0; $i <= $length; $i++) { + if (($i % 2) === 0) { + $sum += $barcode[$length - $i] * 3; + } else { + $sum += $barcode[$length - $i]; + } + } + + $calc = $sum % 10; + $checksum = $calc === 0 ? 0 : 10 - $calc; + + return $value[$length + 1] === (string) $checksum; + } + + /** + * Validates the checksum (Modulo 10) + * IDENTCODE implementation factors 9 and 4 + * + * @param string $value The barcode to validate + * @return bool + */ + protected function identcode($value) + { + $barcode = substr($value, 0, -1); + $sum = 0; + $length = strlen($value) - 2; + + for ($i = 0; $i <= $length; $i++) { + if (($i % 2) === 0) { + $sum += $barcode[$length - $i] * 4; + } else { + $sum += $barcode[$length - $i] * 9; + } + } + + $calc = $sum % 10; + $checksum = $calc === 0 ? 0 : 10 - $calc; + + return $value[$length + 1] === (string) $checksum; + } + + /** + * Validates the checksum (Modulo 10) + * CODE25 implementation factor 3 + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code25($value) + { + $barcode = substr($value, 0, -1); + $sum = 0; + $length = strlen($barcode) - 1; + + for ($i = 0; $i <= $length; $i++) { + if (($i % 2) === 0) { + $sum += $barcode[$i] * 3; + } else { + $sum += $barcode[$i]; + } + } + + $calc = $sum % 10; + $checksum = $calc === 0 ? 0 : 10 - $calc; + + return $value[$length + 1] === (string) $checksum; + } + + /** + * Validates the checksum () + * POSTNET implementation + * + * @param string $value The barcode to validate + * @return bool + */ + protected function postnet($value) + { + $checksum = substr($value, -1, 1); + $values = str_split(substr($value, 0, -1)); + + $check = 0; + foreach ($values as $row) { + $check += $row; + } + + $check %= 10; + $check = 10 - $check; + + return (string) $check === $checksum; + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/AdapterInterface.php b/vendor/laminas/laminas-validator/src/Barcode/AdapterInterface.php new file mode 100644 index 00000000..8bb9efa9 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/AdapterInterface.php @@ -0,0 +1,66 @@ +setLength(-1); + $this->setCharacters('0123456789-$:/.+ABCDTN*E'); + $this->useChecksum(false); + } + + /** + * Checks for allowed characters + * + * @see Laminas\Validator\Barcode.AbstractAdapter::checkChars() + * + * @param string $value + * @return bool + */ + public function hasValidCharacters($value) + { + if (strpbrk($value, 'ABCD') !== false) { + $first = $value[0]; + if (strpbrk($first, 'ABCD') === false) { + // Missing start char + return false; + } + + $last = substr($value, -1, 1); + if (strpbrk($last, 'ABCD') === false) { + // Missing stop char + return false; + } + + $value = substr($value, 1, -1); + } elseif (strpbrk($value, 'TN*E') !== false) { + $first = $value[0]; + if (strpbrk($first, 'TN*E') === false) { + // Missing start char + return false; + } + + $last = substr($value, -1, 1); + if (strpbrk($last, 'TN*E') === false) { + // Missing stop char + return false; + } + + $value = substr($value, 1, -1); + } + + $chars = $this->getCharacters(); + $this->setCharacters('0123456789-$:/.+'); + $result = parent::hasValidCharacters($value); + $this->setCharacters($chars); + return $result; + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code128.php b/vendor/laminas/laminas-validator/src/Barcode/Code128.php new file mode 100644 index 00000000..0bd3bffe --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code128.php @@ -0,0 +1,738 @@ +setLength(-1); + $this->setCharacters([ + 'A' => [ + 0 => ' ', + 1 => '!', + 2 => '"', + 3 => '#', + 4 => '$', + 5 => '%', + 6 => '&', + 7 => "'", + 8 => '(', + 9 => ')', + 10 => '*', + 11 => '+', + 12 => ',', + 13 => '-', + 14 => '.', + 15 => '/', + 16 => '0', + 17 => '1', + 18 => '2', + 19 => '3', + 20 => '4', + 21 => '5', + 22 => '6', + 23 => '7', + 24 => '8', + 25 => '9', + 26 => ':', + 27 => ';', + 28 => '<', + 29 => '=', + 30 => '>', + 31 => '?', + 32 => '@', + 33 => 'A', + 34 => 'B', + 35 => 'C', + 36 => 'D', + 37 => 'E', + 38 => 'F', + 39 => 'G', + 40 => 'H', + 41 => 'I', + 42 => 'J', + 43 => 'K', + 44 => 'L', + 45 => 'M', + 46 => 'N', + 47 => 'O', + 48 => 'P', + 49 => 'Q', + 50 => 'R', + 51 => 'S', + 52 => 'T', + 53 => 'U', + 54 => 'V', + 55 => 'W', + 56 => 'X', + 57 => 'Y', + 58 => 'Z', + 59 => '[', + 60 => '\\', + 61 => ']', + 62 => '^', + 63 => '_', + 64 => 0x00, + 65 => 0x01, + 66 => 0x02, + 67 => 0x03, + 68 => 0x04, + 69 => 0x05, + 70 => 0x06, + 71 => 0x07, + 72 => 0x08, + 73 => 0x09, + 74 => 0x0A, + 75 => 0x0B, + 76 => 0x0C, + 77 => 0x0D, + 78 => 0x0E, + 79 => 0x0F, + 80 => 0x10, + 81 => 0x11, + 82 => 0x12, + 83 => 0x13, + 84 => 0x14, + 85 => 0x15, + 86 => 0x16, + 87 => 0x17, + 88 => 0x18, + 89 => 0x19, + 90 => 0x1A, + 91 => 0x1B, + 92 => 0x1C, + 93 => 0x1D, + 94 => 0x1E, + 95 => 0x1F, + 96 => 'Ç', + 97 => 'ü', + 98 => 'é', + 99 => 'â', + 100 => 'ä', + 101 => 'à', + 102 => 'å', + 103 => '‡', + 104 => 'ˆ', + 105 => '‰', + 106 => 'Š', + ], + 'B' => [ + 0 => ' ', + 1 => '!', + 2 => '"', + 3 => '#', + 4 => '$', + 5 => '%', + 6 => '&', + 7 => "'", + 8 => '(', + 9 => ')', + 10 => '*', + 11 => '+', + 12 => ',', + 13 => '-', + 14 => '.', + 15 => '/', + 16 => '0', + 17 => '1', + 18 => '2', + 19 => '3', + 20 => '4', + 21 => '5', + 22 => '6', + 23 => '7', + 24 => '8', + 25 => '9', + 26 => ':', + 27 => ';', + 28 => '<', + 29 => '=', + 30 => '>', + 31 => '?', + 32 => '@', + 33 => 'A', + 34 => 'B', + 35 => 'C', + 36 => 'D', + 37 => 'E', + 38 => 'F', + 39 => 'G', + 40 => 'H', + 41 => 'I', + 42 => 'J', + 43 => 'K', + 44 => 'L', + 45 => 'M', + 46 => 'N', + 47 => 'O', + 48 => 'P', + 49 => 'Q', + 50 => 'R', + 51 => 'S', + 52 => 'T', + 53 => 'U', + 54 => 'V', + 55 => 'W', + 56 => 'X', + 57 => 'Y', + 58 => 'Z', + 59 => '[', + 60 => '\\', + 61 => ']', + 62 => '^', + 63 => '_', + 64 => '`', + 65 => 'a', + 66 => 'b', + 67 => 'c', + 68 => 'd', + 69 => 'e', + 70 => 'f', + 71 => 'g', + 72 => 'h', + 73 => 'i', + 74 => 'j', + 75 => 'k', + 76 => 'l', + 77 => 'm', + 78 => 'n', + 79 => 'o', + 80 => 'p', + 81 => 'q', + 82 => 'r', + 83 => 's', + 84 => 't', + 85 => 'u', + 86 => 'v', + 87 => 'w', + 88 => 'x', + 89 => 'y', + 90 => 'z', + 91 => '{', + 92 => '|', + 93 => '}', + 94 => '~', + 95 => 0x7F, + 96 => 'Ç', + 97 => 'ü', + 98 => 'é', + 99 => 'â', + 100 => 'ä', + 101 => 'à', + 102 => 'å', + 103 => '‡', + 104 => 'ˆ', + 105 => '‰', + 106 => 'Š', + ], + 'C' => [ + 0 => '00', + 1 => '01', + 2 => '02', + 3 => '03', + 4 => '04', + 5 => '05', + 6 => '06', + 7 => '07', + 8 => '08', + 9 => '09', + 10 => '10', + 11 => '11', + 12 => '12', + 13 => '13', + 14 => '14', + 15 => '15', + 16 => '16', + 17 => '17', + 18 => '18', + 19 => '19', + 20 => '20', + 21 => '21', + 22 => '22', + 23 => '23', + 24 => '24', + 25 => '25', + 26 => '26', + 27 => '27', + 28 => '28', + 29 => '29', + 30 => '30', + 31 => '31', + 32 => '32', + 33 => '33', + 34 => '34', + 35 => '35', + 36 => '36', + 37 => '37', + 38 => '38', + 39 => '39', + 40 => '40', + 41 => '41', + 42 => '42', + 43 => '43', + 44 => '44', + 45 => '45', + 46 => '46', + 47 => '47', + 48 => '48', + 49 => '49', + 50 => '50', + 51 => '51', + 52 => '52', + 53 => '53', + 54 => '54', + 55 => '55', + 56 => '56', + 57 => '57', + 58 => '58', + 59 => '59', + 60 => '60', + 61 => '61', + 62 => '62', + 63 => '63', + 64 => '64', + 65 => '65', + 66 => '66', + 67 => '67', + 68 => '68', + 69 => '69', + 70 => '70', + 71 => '71', + 72 => '72', + 73 => '73', + 74 => '74', + 75 => '75', + 76 => '76', + 77 => '77', + 78 => '78', + 79 => '79', + 80 => '80', + 81 => '81', + 82 => '82', + 83 => '83', + 84 => '84', + 85 => '85', + 86 => '86', + 87 => '87', + 88 => '88', + 89 => '89', + 90 => '90', + 91 => '91', + 92 => '92', + 93 => '93', + 94 => '94', + 95 => '95', + 96 => '96', + 97 => '97', + 98 => '98', + 99 => '99', + 100 => 'ä', + 101 => 'à', + 102 => 'å', + 103 => '‡', + 104 => 'ˆ', + 105 => '‰', + 106 => 'Š', + ], + ]); + $this->setChecksum('code128'); + } + + /** + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return void + */ + public function setUtf8StringWrapper(StringWrapperInterface $utf8StringWrapper) + { + if (! $utf8StringWrapper->isSupported('UTF-8')) { + throw new Exception\InvalidArgumentException( + 'The string wrapper needs to support UTF-8 character encoding' + ); + } + $this->utf8StringWrapper = $utf8StringWrapper; + } + + /** + * Get the string wrapper supporting UTF-8 character encoding + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return StringWrapperInterface + */ + public function getUtf8StringWrapper() + { + if (! $this->utf8StringWrapper) { + $this->utf8StringWrapper = StringUtils::getWrapper('UTF-8'); + } + return $this->utf8StringWrapper; + } + + /** + * Checks for allowed characters within the barcode + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if (! is_string($value)) { + return false; + } + + // get used string wrapper for UTF-8 character encoding + $strWrapper = $this->getUtf8StringWrapper(); + + // detect starting charset + $set = $this->getCodingSet($value); + $read = $set; + if ($set !== '') { + $value = $strWrapper->substr($value, 1, null); + } + + // process barcode + while ($value !== '' && $value !== false) { + $char = $strWrapper->substr($value, 0, 1); + + switch ($char) { + // Function definition + case 'Ç': + case 'ü': + case 'å': + break; + + // Switch 1 char between A and B + case 'é': + if ($set === 'A') { + $read = 'B'; + break; + } + + if ($set === 'B') { + $read = 'A'; + break; + } + + break; + + // Switch to C + case 'â': + $set = 'C'; + $read = 'C'; + break; + + // Switch to B + case 'ä': + $set = 'B'; + $read = 'B'; + break; + + // Switch to A + case 'à': + $set = 'A'; + $read = 'A'; + break; + + // Doubled start character + case '‡': + case 'ˆ': + case '‰': + return false; + + // Chars after the stop character + case 'Š': + break 2; + + default: + // Does the char exist within the charset to read? + if ($this->ord128($char, $read) === -1) { + return false; + } + + break; + } + + $value = $strWrapper->substr($value, 1, null); + $read = $set; + } + + if ($value !== '' && is_string($value) && $strWrapper->strlen($value) !== 1) { + return false; + } + + return true; + } + + /** + * Validates the checksum () + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code128($value) + { + $sum = 0; + $pos = 1; + $set = $this->getCodingSet($value); + $read = $set; + $usecheck = $this->useChecksum(null); + $strWrapper = $this->getUtf8StringWrapper(); + $char = $strWrapper->substr($value, 0, 1); + if ($char === '‡') { + $sum = 103; + } elseif ($char === 'ˆ') { + $sum = 104; + } elseif ($char === '‰') { + $sum = 105; + } elseif ($usecheck === true) { + // no start value, unable to detect a proper checksum + return false; + } + + $value = $strWrapper->substr($value, 1, null); + while ($strWrapper->strpos((string) $value, 'Š') !== false || ((string) $value !== '')) { + $char = $strWrapper->substr($value, 0, 1); + if ($read === 'C') { + $char = $strWrapper->substr($value, 0, 2); + } + + switch ($char) { + // Function definition + case 'Ç': + case 'ü': + case 'å': + $sum += $pos * $this->ord128($char, $set); + break; + + case 'é': + $sum += $pos * $this->ord128($char, $set); + + if ($set === 'A') { + $read = 'B'; + break; + } + + if ($set === 'B') { + $read = 'A'; + break; + } + + break; + + // Switch to C + case 'â': + $sum += $pos * $this->ord128($char, $set); + $set = 'C'; + $read = 'C'; + break; + + // Switch to B + case 'ä': + $sum += $pos * $this->ord128($char, $set); + $set = 'B'; + $read = 'B'; + break; + + // Switch to A + case 'à': + $sum += $pos * $this->ord128($char, $set); + $set = 'A'; + $read = 'A'; + break; + + case '‡': + case 'ˆ': + case '‰': + return false; + + default: + // Does the char exist within the charset to read? + if ($this->ord128($char, $read) === -1) { + return false; + } + + $sum += $pos * $this->ord128($char, $set); + break; + } + + $value = $strWrapper->substr($value, 1); + ++$pos; + if (($strWrapper->strpos($value, 'Š') === 1) && ($strWrapper->strlen($value) === 2)) { + // break by stop and checksum char + break; + } + $read = $set; + } + + if (($strWrapper->strpos($value, 'Š') !== 1) || ($strWrapper->strlen($value) !== 2)) { + // return false if checksum is not readable and true if no startvalue is detected + return ! $usecheck; + } + + $mod = $sum % 103; + if ($strWrapper->substr($value, 0, 1) === $this->chr128($mod, $set)) { + return true; + } + + return false; + } + + /** + * Returns the coding set for a barcode + * + * @param string $value Barcode + * @return string + */ + protected function getCodingSet($value) + { + $value = $this->getUtf8StringWrapper()->substr($value, 0, 1); + return match ($value) { + '‡' => 'A', + 'ˆ' => 'B', + '‰' => 'C', + default => '', + }; + } + + /** + * Internal method to return the code128 integer from an ascii value + * + * Table A + * ASCII CODE128 + * 32 to 95 == 0 to 63 + * 0 to 31 == 64 to 95 + * 128 to 138 == 96 to 106 + * + * Table B + * ASCII CODE128 + * 32 to 138 == 0 to 106 + * + * Table C + * ASCII CODE128 + * "00" to "99" == 0 to 99 + * 132 to 138 == 100 to 106 + * + * @param string $value + * @param string $set + * @return int + */ + protected function ord128($value, $set) + { + $ord = ord($value); + if ($set === 'A') { + if ($ord < 32) { + return $ord + 64; + } elseif ($ord < 96) { + return $ord - 32; + } elseif ($ord > 138) { + return -1; + } else { + return $ord - 32; + } + } elseif ($set === 'B') { + if ($ord < 32) { + return -1; + } elseif ($ord <= 138) { + return $ord - 32; + } else { + return -1; + } + } elseif ($set === 'C') { + $val = (int) $value; + if (($val >= 0) && ($val <= 99)) { + return $val; + } elseif (($ord >= 132) && ($ord <= 138)) { + return $ord - 32; + } else { + return -1; + } + } else { + if ($ord < 32) { + return $ord + 64; + } elseif ($ord <= 138) { + return $ord - 32; + } else { + return -1; + } + } + } + + /** + * Internal Method to return the ascii value from a code128 integer + * + * Table A + * ASCII CODE128 + * 32 to 95 == 0 to 63 + * 0 to 31 == 64 to 95 + * 128 to 138 == 96 to 106 + * + * Table B + * ASCII CODE128 + * 32 to 138 == 0 to 106 + * + * Table C + * ASCII CODE128 + * "00" to "99" == 0 to 99 + * 132 to 138 == 100 to 106 + * + * @param int $value + * @param string $set + * @return int|string + */ + protected function chr128($value, $set) + { + if ($set === 'A') { + if ($value < 64) { + return chr($value + 32); + } elseif ($value < 96) { + return chr($value - 64); + } elseif ($value > 106) { + return -1; + } else { + return chr($value + 32); + } + } elseif ($set === 'B') { + if ($value > 106) { + return -1; + } else { + return chr($value + 32); + } + } elseif ($set === 'C') { + if (($value >= 0) && ($value <= 9)) { + return '0' . (string) $value; + } elseif ($value <= 99) { + return (string) $value; + } elseif ($value <= 106) { + return chr($value + 32); + } else { + return -1; + } + } else { + if ($value <= 106) { + return $value + 32; + } else { + return -1; + } + } + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code25.php b/vendor/laminas/laminas-validator/src/Barcode/Code25.php new file mode 100644 index 00000000..c31c78b9 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code25.php @@ -0,0 +1,18 @@ +setLength(-1); + $this->setCharacters('0123456789'); + $this->setChecksum('code25'); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code25interleaved.php b/vendor/laminas/laminas-validator/src/Barcode/Code25interleaved.php new file mode 100644 index 00000000..263ad92c --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code25interleaved.php @@ -0,0 +1,20 @@ +setLength('even'); + $this->setCharacters('0123456789'); + $this->setChecksum('code25'); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code39.php b/vendor/laminas/laminas-validator/src/Barcode/Code39.php new file mode 100644 index 00000000..2fe46da9 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code39.php @@ -0,0 +1,91 @@ + 0, + '1' => 1, + '2' => 2, + '3' => 3, + '4' => 4, + '5' => 5, + '6' => 6, + '7' => 7, + '8' => 8, + '9' => 9, + 'A' => 10, + 'B' => 11, + 'C' => 12, + 'D' => 13, + 'E' => 14, + 'F' => 15, + 'G' => 16, + 'H' => 17, + 'I' => 18, + 'J' => 19, + 'K' => 20, + 'L' => 21, + 'M' => 22, + 'N' => 23, + 'O' => 24, + 'P' => 25, + 'Q' => 26, + 'R' => 27, + 'S' => 28, + 'T' => 29, + 'U' => 30, + 'V' => 31, + 'W' => 32, + 'X' => 33, + 'Y' => 34, + 'Z' => 35, + '-' => 36, + '.' => 37, + ' ' => 38, + '$' => 39, + '/' => 40, + '+' => 41, + '%' => 42, + ]; + + /** + * Constructor for this barcode adapter + */ + public function __construct() + { + $this->setLength(-1); + $this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -.$/+%'); + $this->setChecksum('code39'); + $this->useChecksum(false); + } + + /** + * Validates the checksum (Modulo 43) + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code39($value) + { + $checksum = substr($value, -1, 1); + $value = str_split(substr($value, 0, -1)); + $count = 0; + foreach ($value as $char) { + $count += $this->check[$char]; + } + + $mod = $count % 43; + if ($mod === $this->check[$checksum]) { + return true; + } + + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code39ext.php b/vendor/laminas/laminas-validator/src/Barcode/Code39ext.php new file mode 100644 index 00000000..eff8ffca --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code39ext.php @@ -0,0 +1,17 @@ +setLength(-1); + $this->setCharacters(128); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code93.php b/vendor/laminas/laminas-validator/src/Barcode/Code93.php new file mode 100644 index 00000000..5411ece5 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code93.php @@ -0,0 +1,120 @@ + 0, + '1' => 1, + '2' => 2, + '3' => 3, + '4' => 4, + '5' => 5, + '6' => 6, + '7' => 7, + '8' => 8, + '9' => 9, + 'A' => 10, + 'B' => 11, + 'C' => 12, + 'D' => 13, + 'E' => 14, + 'F' => 15, + 'G' => 16, + 'H' => 17, + 'I' => 18, + 'J' => 19, + 'K' => 20, + 'L' => 21, + 'M' => 22, + 'N' => 23, + 'O' => 24, + 'P' => 25, + 'Q' => 26, + 'R' => 27, + 'S' => 28, + 'T' => 29, + 'U' => 30, + 'V' => 31, + 'W' => 32, + 'X' => 33, + 'Y' => 34, + 'Z' => 35, + '-' => 36, + '.' => 37, + ' ' => 38, + '$' => 39, + '/' => 40, + '+' => 41, + '%' => 42, + '!' => 43, + '"' => 44, + '§' => 45, + '&' => 46, + ]; + + /** + * Constructor for this barcode adapter + */ + public function __construct() + { + $this->setLength(-1); + $this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -.$/+%'); + $this->setChecksum('code93'); + $this->useChecksum(false); + } + + /** + * Validates the checksum (Modulo CK) + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code93($value) + { + $checksum = substr($value, -2, 2); + $value = str_split(substr($value, 0, -2)); + $count = 0; + $length = count($value) % 20; + foreach ($value as $char) { + if ($length === 0) { + $length = 20; + } + + $count += $this->check[$char] * $length; + --$length; + } + + $check = array_search($count % 47, $this->check); + $value[] = $check; + $count = 0; + $length = count($value) % 15; + foreach ($value as $char) { + if ($length === 0) { + $length = 15; + } + + $count += $this->check[$char] * $length; + --$length; + } + $check .= array_search($count % 47, $this->check); + + if ($check === $checksum) { + return true; + } + + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Code93ext.php b/vendor/laminas/laminas-validator/src/Barcode/Code93ext.php new file mode 100644 index 00000000..e5ee6820 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Code93ext.php @@ -0,0 +1,17 @@ +setLength(-1); + $this->setCharacters(128); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean12.php b/vendor/laminas/laminas-validator/src/Barcode/Ean12.php new file mode 100644 index 00000000..14073bc7 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean12.php @@ -0,0 +1,17 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean13.php b/vendor/laminas/laminas-validator/src/Barcode/Ean13.php new file mode 100644 index 00000000..2b27a966 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean13.php @@ -0,0 +1,17 @@ +setLength(13); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean14.php b/vendor/laminas/laminas-validator/src/Barcode/Ean14.php new file mode 100644 index 00000000..6e515062 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean14.php @@ -0,0 +1,17 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean18.php b/vendor/laminas/laminas-validator/src/Barcode/Ean18.php new file mode 100644 index 00000000..643addae --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean18.php @@ -0,0 +1,17 @@ +setLength(18); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean2.php b/vendor/laminas/laminas-validator/src/Barcode/Ean2.php new file mode 100644 index 00000000..3769a56a --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean2.php @@ -0,0 +1,17 @@ +setLength(2); + $this->setCharacters('0123456789'); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean5.php b/vendor/laminas/laminas-validator/src/Barcode/Ean5.php new file mode 100644 index 00000000..31bd1f02 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean5.php @@ -0,0 +1,19 @@ +setLength(5); + $this->setCharacters('0123456789'); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Ean8.php b/vendor/laminas/laminas-validator/src/Barcode/Ean8.php new file mode 100644 index 00000000..008bfa9a --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Ean8.php @@ -0,0 +1,36 @@ +setLength([7, 8]); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } + + /** + * Overrides parent checkLength + * + * @param string $value Value + * @return bool + */ + public function hasValidLength($value) + { + if (strlen($value) === 7) { + $this->useChecksum(false); + } else { + $this->useChecksum(true); + } + + return parent::hasValidLength($value); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Gtin12.php b/vendor/laminas/laminas-validator/src/Barcode/Gtin12.php new file mode 100644 index 00000000..0920396e --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Gtin12.php @@ -0,0 +1,17 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Gtin13.php b/vendor/laminas/laminas-validator/src/Barcode/Gtin13.php new file mode 100644 index 00000000..05d3cb75 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Gtin13.php @@ -0,0 +1,17 @@ +setLength(13); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Gtin14.php b/vendor/laminas/laminas-validator/src/Barcode/Gtin14.php new file mode 100644 index 00000000..9d2a061e --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Gtin14.php @@ -0,0 +1,17 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Identcode.php b/vendor/laminas/laminas-validator/src/Barcode/Identcode.php new file mode 100644 index 00000000..32d05db8 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Identcode.php @@ -0,0 +1,38 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('identcode'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Intelligentmail.php b/vendor/laminas/laminas-validator/src/Barcode/Intelligentmail.php new file mode 100644 index 00000000..de06684a --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Intelligentmail.php @@ -0,0 +1,19 @@ +setLength([20, 25, 29, 31]); + $this->setCharacters('0123456789'); + $this->useChecksum(false); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Issn.php b/vendor/laminas/laminas-validator/src/Barcode/Issn.php new file mode 100644 index 00000000..ed8e3952 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Issn.php @@ -0,0 +1,92 @@ +setLength([8, 13]); + $this->setCharacters('0123456789X'); + $this->setChecksum('gtin'); + } + + /** + * Allows X on length of 8 chars + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if (strlen($value) !== 8) { + if (str_contains($value, 'X')) { + return false; + } + } + + return parent::hasValidCharacters($value); + } + + /** + * Validates the checksum + * + * @param string $value The barcode to check the checksum for + * @return bool + */ + public function hasValidChecksum($value) + { + if (strlen($value) === 8) { + $this->setChecksum('issn'); + } else { + $this->setChecksum('gtin'); + } + + return parent::hasValidChecksum($value); + } + + /** + * Validates the checksum () + * ISSN implementation (reversed mod11) + * + * @param string $value The barcode to validate + * @return bool + */ + protected function issn($value) + { + $checksum = substr($value, -1, 1); + $values = str_split(substr($value, 0, -1)); + $check = 0; + $multi = 8; + foreach ($values as $token) { + if ($token === 'X') { + $token = 10; + } + + $check += $token * $multi; + --$multi; + } + + $check %= 11; + $check = $check === 0 ? 0 : 11 - $check; + + if ((string) $check === $checksum) { + return true; + } + + if (($check === 10) && ($checksum === 'X')) { + return true; + } + + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Itf14.php b/vendor/laminas/laminas-validator/src/Barcode/Itf14.php new file mode 100644 index 00000000..59dbb8b5 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Itf14.php @@ -0,0 +1,17 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Leitcode.php b/vendor/laminas/laminas-validator/src/Barcode/Leitcode.php new file mode 100644 index 00000000..759a2da8 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Leitcode.php @@ -0,0 +1,17 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('identcode'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Planet.php b/vendor/laminas/laminas-validator/src/Barcode/Planet.php new file mode 100644 index 00000000..4323d994 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Planet.php @@ -0,0 +1,17 @@ +setLength([12, 14]); + $this->setCharacters('0123456789'); + $this->setChecksum('postnet'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Postnet.php b/vendor/laminas/laminas-validator/src/Barcode/Postnet.php new file mode 100644 index 00000000..8a78c863 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Postnet.php @@ -0,0 +1,17 @@ +setLength([6, 7, 10, 12]); + $this->setCharacters('0123456789'); + $this->setChecksum('postnet'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Royalmail.php b/vendor/laminas/laminas-validator/src/Barcode/Royalmail.php new file mode 100644 index 00000000..57b71d82 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Royalmail.php @@ -0,0 +1,157 @@ + */ + protected $rows = [ + '0' => 1, + '1' => 1, + '2' => 1, + '3' => 1, + '4' => 1, + '5' => 1, + '6' => 2, + '7' => 2, + '8' => 2, + '9' => 2, + 'A' => 2, + 'B' => 2, + 'C' => 3, + 'D' => 3, + 'E' => 3, + 'F' => 3, + 'G' => 3, + 'H' => 3, + 'I' => 4, + 'J' => 4, + 'K' => 4, + 'L' => 4, + 'M' => 4, + 'N' => 4, + 'O' => 5, + 'P' => 5, + 'Q' => 5, + 'R' => 5, + 'S' => 5, + 'T' => 5, + 'U' => 0, + 'V' => 0, + 'W' => 0, + 'X' => 0, + 'Y' => 0, + 'Z' => 0, + ]; + + /** @var array */ + protected $columns = [ + '0' => 1, + '1' => 2, + '2' => 3, + '3' => 4, + '4' => 5, + '5' => 0, + '6' => 1, + '7' => 2, + '8' => 3, + '9' => 4, + 'A' => 5, + 'B' => 0, + 'C' => 1, + 'D' => 2, + 'E' => 3, + 'F' => 4, + 'G' => 5, + 'H' => 0, + 'I' => 1, + 'J' => 2, + 'K' => 3, + 'L' => 4, + 'M' => 5, + 'N' => 0, + 'O' => 1, + 'P' => 2, + 'Q' => 3, + 'R' => 4, + 'S' => 5, + 'T' => 0, + 'U' => 1, + 'V' => 2, + 'W' => 3, + 'X' => 4, + 'Y' => 5, + 'Z' => 0, + ]; + + /** + * Constructor for this barcode adapter + */ + public function __construct() + { + $this->setLength(-1); + $this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); + $this->setChecksum('royalmail'); + } + + /** + * Validates the checksum () + * + * @param string $value The barcode to validate + * @return bool + */ + protected function royalmail($value) + { + $checksum = substr($value, -1, 1); + $values = str_split(substr($value, 0, -1)); + $rowvalue = 0; + $colvalue = 0; + foreach ($values as $row) { + $rowvalue += $this->rows[$row]; + $colvalue += $this->columns[$row]; + } + + $rowvalue %= 6; + $colvalue %= 6; + + $rowchkvalue = array_keys($this->rows, $rowvalue); + $colchkvalue = array_keys($this->columns, $colvalue); + $intersect = array_intersect($rowchkvalue, $colchkvalue); + $chkvalue = (string) current($intersect); + + if ($chkvalue === $checksum) { + return true; + } + + return false; + } + + /** + * Allows start and stop tag within checked chars + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if ($value[0] === '(') { + $value = substr($value, 1); + + if ($value[strlen($value) - 1] === ')') { + $value = substr($value, 0, -1); + } else { + return false; + } + } + + return parent::hasValidCharacters($value); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Sscc.php b/vendor/laminas/laminas-validator/src/Barcode/Sscc.php new file mode 100644 index 00000000..6d9d204d --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Sscc.php @@ -0,0 +1,17 @@ +setLength(18); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Upca.php b/vendor/laminas/laminas-validator/src/Barcode/Upca.php new file mode 100644 index 00000000..c9d6b131 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Upca.php @@ -0,0 +1,17 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/laminas/laminas-validator/src/Barcode/Upce.php b/vendor/laminas/laminas-validator/src/Barcode/Upce.php new file mode 100644 index 00000000..07f223e8 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Barcode/Upce.php @@ -0,0 +1,36 @@ +setLength([6, 7, 8]); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } + + /** + * Overrides parent checkLength + * + * @param string $value Value + * @return bool + */ + public function hasValidLength($value) + { + if (strlen($value) !== 8) { + $this->useChecksum(false); + } else { + $this->useChecksum(true); + } + + return parent::hasValidLength($value); + } +} diff --git a/vendor/laminas/laminas-validator/src/Between.php b/vendor/laminas/laminas-validator/src/Between.php new file mode 100644 index 00000000..1026e52c --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Between.php @@ -0,0 +1,220 @@ + + */ + protected $messageTemplates = [ + self::NOT_BETWEEN => "The input is not between '%min%' and '%max%', inclusively", + self::NOT_BETWEEN_STRICT => "The input is not strictly between '%min%' and '%max%'", + self::VALUE_NOT_NUMERIC => "The min ('%min%') and max ('%max%') values are numeric, but the input is not", + self::VALUE_NOT_STRING => "The min ('%min%') and max ('%max%') values are non-numeric strings, " + . 'but the input is not a string', + ]; + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = [ + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + ]; + + /** + * Options for the between validator + * + * @var array + */ + protected $options = [ + 'inclusive' => true, // Whether to do inclusive comparisons, allowing equivalence to min and/or max + 'min' => 0, + 'max' => PHP_INT_MAX, + ]; + + /** + * Sets validator options + * Accepts the following option keys: + * 'min' => scalar, minimum border + * 'max' => scalar, maximum border + * 'inclusive' => boolean, inclusive border values + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (! is_array($options)) { + $temp = []; + /** @psalm-var array $options */ + $options = func_get_args(); + $temp['min'] = array_shift($options); + if (! empty($options)) { + $temp['max'] = array_shift($options); + } + + if (! empty($options)) { + $temp['inclusive'] = array_shift($options); + } + + $options = $temp; + } + + if (! array_key_exists('min', $options) || ! array_key_exists('max', $options)) { + throw new Exception\InvalidArgumentException("Missing option: 'min' and 'max' have to be given"); + } + + if ( + (isset($options['min']) && is_numeric($options['min'])) + && (isset($options['max']) && is_numeric($options['max'])) + ) { + $this->numeric = true; + } elseif ( + (isset($options['min']) && is_string($options['min'])) + && (isset($options['max']) && is_string($options['max'])) + ) { + $this->numeric = false; + } else { + throw new Exception\InvalidArgumentException( + "Invalid options: 'min' and 'max' should be of the same scalar type" + ); + } + + parent::__construct($options); + } + + /** + * Returns the min option + * + * @return mixed + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the min option + * + * @return $this Provides a fluent interface + */ + public function setMin(mixed $min) + { + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the max option + * + * @return mixed + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the max option + * + * @return $this Provides a fluent interface + */ + public function setMax(mixed $max) + { + $this->options['max'] = $max; + return $this; + } + + /** + * Returns the inclusive option + * + * @return bool + */ + public function getInclusive() + { + return $this->options['inclusive']; + } + + /** + * Sets the inclusive option + * + * @param bool $inclusive + * @return $this Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->options['inclusive'] = $inclusive; + return $this; + } + + /** + * Returns true if and only if $value is between min and max options, inclusively + * if inclusive option is true. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if ($this->numeric && ! is_numeric($value)) { + $this->error(self::VALUE_NOT_NUMERIC); + return false; + } + if (! $this->numeric && ! is_string($value)) { + $this->error(self::VALUE_NOT_STRING); + return false; + } + + if ($this->getInclusive()) { + if ($this->getMin() > $value || $value > $this->getMax()) { + $this->error(self::NOT_BETWEEN); + return false; + } + } else { + if ($this->getMin() >= $value || $value >= $this->getMax()) { + $this->error(self::NOT_BETWEEN_STRICT); + return false; + } + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Bitwise.php b/vendor/laminas/laminas-validator/src/Bitwise.php new file mode 100644 index 00000000..da999504 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Bitwise.php @@ -0,0 +1,216 @@ + + */ + protected $messageTemplates = [ + self::NOT_AND => "The input has no common bit set with '%control%'", + self::NOT_AND_STRICT => "The input doesn't have the same bits set as '%control%'", + self::NOT_XOR => "The input has common bit set with '%control%'", + self::NO_OP => "No operator was present to compare '%control%' against", + ]; + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = [ + 'control' => 'control', + ]; + + /** @var null|string */ + protected $operator; + + /** @var bool */ + protected $strict = false; + + /** + * Sets validator options + * Accepts the following option keys: + * 'control' => int + * 'operator' => + * 'strict' => bool + * + * @param array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } + + if (! is_array($options)) { + $options = func_get_args(); + + $temp['control'] = array_shift($options); + + if (! empty($options)) { + $temp['operator'] = array_shift($options); + } + + if (! empty($options)) { + $temp['strict'] = array_shift($options); + } + + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Returns the control parameter. + * + * @deprecated Since 2.60 All option getters and setters will be removed in 3.0 + * + * @return integer + */ + public function getControl() + { + return $this->control; + } + + /** + * Returns the operator parameter. + * + * @deprecated Since 2.60 All option getters and setters will be removed in 3.0 + * + * @return null|string + */ + public function getOperator() + { + return $this->operator; + } + + /** + * Returns the strict parameter. + * + * @deprecated Since 2.60 All option getters and setters will be removed in 3.0 + * + * @return boolean + */ + public function getStrict() + { + return $this->strict; + } + + /** + * Returns true if and only if $value is between min and max options, inclusively + * if inclusive option is true. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if (self::OP_AND === $this->operator) { + if ($this->strict) { + // All the bits set in value must be set in control + $result = ($this->control & $value) === $value; + + if (! $result) { + $this->error(self::NOT_AND_STRICT); + } + + return $result; + } + + // At least one of the bits must be common between value and control + $result = (bool) ($this->control & $value); + + if (! $result) { + $this->error(self::NOT_AND); + } + + return $result; + } + + if (self::OP_XOR === $this->operator) { + // Parentheses are required due to order of operations with bitwise operations + // phpcs:ignore WebimpressCodingStandard.Formatting.RedundantParentheses.SingleEquality + $result = ($this->control ^ $value) === ($this->control | $value); + + if (! $result) { + $this->error(self::NOT_XOR); + } + + return $result; + } + + $this->error(self::NO_OP); + return false; + } + + /** + * Sets the control parameter. + * + * @deprecated Since 2.60 All option getters and setters will be removed in 3.0 + * + * @param integer $control + * @return $this + */ + public function setControl($control) + { + $this->control = (int) $control; + + return $this; + } + + /** + * Sets the operator parameter. + * + * @deprecated Since 2.60 All option getters and setters will be removed in 3.0 + * + * @param string $operator + * @return $this + */ + public function setOperator($operator) + { + $this->operator = $operator; + + return $this; + } + + /** + * Sets the strict parameter. + * + * @deprecated Since 2.60 All option getters and setters will be removed in 3.0 + * + * @param boolean $strict + * @return $this + */ + public function setStrict($strict) + { + $this->strict = (bool) $strict; + + return $this; + } +} diff --git a/vendor/laminas/laminas-validator/src/BusinessIdentifierCode.php b/vendor/laminas/laminas-validator/src/BusinessIdentifierCode.php new file mode 100644 index 00000000..b3d42fda --- /dev/null +++ b/vendor/laminas/laminas-validator/src/BusinessIdentifierCode.php @@ -0,0 +1,328 @@ + 'Invalid type given; string expected', + self::INVALID => 'Invalid BIC format', + self::NOT_VALID_COUNTRY => 'Invalid country code', + ]; + + /** + * @see https://www.bundesbank.de/resource/blob/749660/d2c6e00664251b4d83483c229e084e44/mL/technische-spezifikationen-scc-anhang-112018-data.pdf (page 39) + */ + private const REGEX_BIC = '/^[a-z]{4}(?[a-z]{2})[a-z2-9][a-np-z0-9]([0-9a-z]{3})?$/i'; + + /** + * List of all country codes defined by ISO 3166-1 alpha-2 + * + * @see https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Current_codes + * + * @var string[] + */ + private const ISO_COUNTRIES = [ + 'AD', + 'AE', + 'AF', + 'AG', + 'AI', + 'AL', + 'AM', + 'AO', + 'AQ', + 'AR', + 'AS', + 'AT', + 'AU', + 'AW', + 'AX', + 'AZ', + 'BA', + 'BB', + 'BD', + 'BE', + 'BF', + 'BG', + 'BH', + 'BI', + 'BJ', + 'BL', + 'BM', + 'BN', + 'BO', + 'BQ', + 'BQ', + 'BR', + 'BS', + 'BT', + 'BV', + 'BW', + 'BY', + 'BZ', + 'CA', + 'CC', + 'CD', + 'CF', + 'CG', + 'CH', + 'CI', + 'CK', + 'CL', + 'CM', + 'CN', + 'CO', + 'CR', + 'CU', + 'CV', + 'CW', + 'CX', + 'CY', + 'CZ', + 'DE', + 'DJ', + 'DK', + 'DM', + 'DO', + 'DZ', + 'EC', + 'EE', + 'EG', + 'EH', + 'ER', + 'ES', + 'ET', + 'FI', + 'FJ', + 'FK', + 'FM', + 'FO', + 'FR', + 'GA', + 'GB', + 'GD', + 'GE', + 'GF', + 'GG', + 'GH', + 'GI', + 'GL', + 'GM', + 'GN', + 'GP', + 'GQ', + 'GR', + 'GS', + 'GT', + 'GU', + 'GW', + 'GY', + 'HK', + 'HM', + 'HN', + 'HR', + 'HT', + 'HU', + 'ID', + 'IE', + 'IL', + 'IM', + 'IN', + 'IO', + 'IQ', + 'IR', + 'IS', + 'IT', + 'JE', + 'JM', + 'JO', + 'JP', + 'KE', + 'KG', + 'KH', + 'KI', + 'KM', + 'KN', + 'KP', + 'KR', + 'KW', + 'KY', + 'KZ', + 'LA', + 'LB', + 'LC', + 'LI', + 'LK', + 'LR', + 'LS', + 'LT', + 'LU', + 'LV', + 'LY', + 'MA', + 'MC', + 'MD', + 'ME', + 'MF', + 'MG', + 'MH', + 'MK', + 'ML', + 'MM', + 'MN', + 'MO', + 'MP', + 'MQ', + 'MR', + 'MS', + 'MT', + 'MU', + 'MV', + 'MW', + 'MX', + 'MY', + 'MZ', + 'NA', + 'NC', + 'NE', + 'NF', + 'NG', + 'NI', + 'NL', + 'NO', + 'NP', + 'NR', + 'NU', + 'NZ', + 'OM', + 'PA', + 'PE', + 'PF', + 'PG', + 'PH', + 'PK', + 'PL', + 'PM', + 'PN', + 'PR', + 'PS', + 'PT', + 'PW', + 'PY', + 'QA', + 'RE', + 'RO', + 'RS', + 'RU', + 'RW', + 'SA', + 'SB', + 'SC', + 'SD', + 'SE', + 'SG', + 'SH', + 'SI', + 'SJ', + 'SK', + 'SL', + 'SM', + 'SN', + 'SO', + 'SR', + 'SS', + 'ST', + 'SV', + 'SX', + 'SY', + 'SZ', + 'TC', + 'TD', + 'TF', + 'TG', + 'TH', + 'TJ', + 'TK', + 'TL', + 'TM', + 'TN', + 'TO', + 'TR', + 'TT', + 'TV', + 'TW', + 'TZ', + 'UA', + 'UG', + 'UM', + 'US', + 'UY', + 'UZ', + 'VA', + 'VC', + 'VE', + 'VG', + 'VI', + 'VN', + 'VU', + 'WF', + 'WS', + 'YE', + 'YT', + 'ZA', + 'ZM', + 'ZW', + ]; + + /** + * This code is the only one used by SWIFT that is not defined by ISO 3166-1 alpha-2 + * + * @see https://en.wikipedia.org/wiki/ISO_9362 + * + * @var string + */ + private const KOSOVO_EXCEPTION = 'XK'; + + /** {@inheritDoc} */ + public function isValid($value): bool + { + if (! is_string($value)) { + $this->error(self::NOT_STRING); + return false; + } + + if ( + empty($value) + || ! preg_match(self::REGEX_BIC, $value, $matches) + ) { + $this->error(self::INVALID); + return false; + } + + if (! $this->isSwiftValidCountry($matches['country'])) { + $this->error(self::NOT_VALID_COUNTRY); + return false; + } + + return true; + } + + private function isSwiftValidCountry(string $countryCode): bool + { + $countryCode = strtoupper($countryCode); + return in_array($countryCode, self::ISO_COUNTRIES, true) + || $countryCode === self::KOSOVO_EXCEPTION; + } +} diff --git a/vendor/laminas/laminas-validator/src/Callback.php b/vendor/laminas/laminas-validator/src/Callback.php new file mode 100644 index 00000000..2c54c0d8 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Callback.php @@ -0,0 +1,189 @@ +, + * throwExceptions: bool, + * bind: bool, + * } + * @psalm-type OptionsArgument = array{ + * callback: callable, + * callbackOptions?: array, + * throwExceptions?: bool, + * bind?: bool, + * ... + * } + * @final + */ +class Callback extends AbstractValidator +{ + /** + * Invalid callback + */ + public const INVALID_CALLBACK = 'callbackInvalid'; + + /** + * Invalid value + */ + public const INVALID_VALUE = 'callbackValue'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = [ + self::INVALID_VALUE => 'The input is not valid', + self::INVALID_CALLBACK => 'An exception has been raised within the callback', + ]; + + /** + * Default options to set for the validator + * + * @var OptionsProperty + */ + protected $options = [ + 'callback' => null, // Callback in a call_user_func format, string || array + 'callbackOptions' => [], // Options for the callback + 'throwExceptions' => false, // Whether to throw exceptions raised within the callback or not + 'bind' => false, // Bind the callback to the validator instance + ]; + + /** @param OptionsArgument|callable $options */ + public function __construct($options = null) + { + if (is_callable($options)) { + $options = ['callback' => $options]; + } + + $bind = $options['bind'] ?? false; + assert(is_bool($bind)); + $closure = $options['callback'] ?? null; + if (is_callable($closure) && $bind === true) { + $options['callback'] = $closure(...)->bindTo($this); + } + + parent::__construct($options); + } + + /** + * Returns the set callback + * + * @deprecated Since 2.60.0 All option setters and getters will be removed in v3.0 + * + * @return callable|null + */ + public function getCallback() + { + return $this->options['callback']; + } + + /** + * Sets the callback + * + * @deprecated Since 2.60.0 All option setters and getters will be removed in v3.0 + * + * @param callable $callback + * @return $this Provides a fluent interface + * @throws InvalidArgumentException + */ + public function setCallback($callback) + { + if (! is_callable($callback)) { + throw new InvalidArgumentException('Invalid callback given'); + } + + $this->options['callback'] = $callback; + return $this; + } + + /** + * Returns the set options for the callback + * + * @deprecated Since 2.60.0 All option setters and getters will be removed in v3.0 + * + * @return array + */ + public function getCallbackOptions() + { + return $this->options['callbackOptions']; + } + + /** + * Sets options for the callback + * + * @deprecated Since 2.60.0 All option setters and getters will be removed in v3.0 + * + * @param array $options + * @return $this Provides a fluent interface + */ + public function setCallbackOptions(mixed $options) + { + $this->options['callbackOptions'] = (array) $options; + return $this; + } + + /** + * Returns true if and only if the set callback returns + * for the provided $value + * + * @param mixed $value + * @param mixed $context Additional context to provide to the callback + * @return bool + * @throws InvalidArgumentException + */ + public function isValid($value, $context = null) + { + $this->setValue($value); + + $options = $this->getCallbackOptions(); + $callback = $this->getCallback(); + if (! is_callable($callback)) { + throw new InvalidArgumentException('No callback given'); + } + + $args = [$value]; + if (empty($options) && ! empty($context)) { + $args[] = $context; + } + if (! empty($options) && empty($context)) { + $args = array_merge($args, $options); + } + if (! empty($options) && ! empty($context)) { + $args[] = $context; + $args = array_merge($args, $options); + } + + try { + if (! call_user_func_array($callback, $args)) { + $this->error(self::INVALID_VALUE); + return false; + } + } catch (Exception $exception) { + /** + * Intentionally excluding catchable \Error as they are indicative of a bug and should not be suppressed + */ + $this->error(self::INVALID_CALLBACK); + + if ($this->options['throwExceptions'] === true) { + throw $exception; + } + + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/ConfigProvider.php b/vendor/laminas/laminas-validator/src/ConfigProvider.php new file mode 100644 index 00000000..852e133c --- /dev/null +++ b/vendor/laminas/laminas-validator/src/ConfigProvider.php @@ -0,0 +1,41 @@ + $this->getDependencyConfig(), + ]; + } + + /** + * Return dependency mappings for this component. + * + * @return array + */ + public function getDependencyConfig() + { + return [ + 'aliases' => [ + Translator\TranslatorInterface::class => Translator\Translator::class, + 'ValidatorManager' => ValidatorPluginManager::class, + + // Legacy Zend Framework aliases + 'Zend\Validator\ValidatorPluginManager' => ValidatorPluginManager::class, + ], + 'factories' => [ + Translator\Translator::class => Translator\TranslatorFactory::class, + ValidatorPluginManager::class => ValidatorPluginManagerFactory::class, + ], + ]; + } +} diff --git a/vendor/laminas/laminas-validator/src/CreditCard.php b/vendor/laminas/laminas-validator/src/CreditCard.php new file mode 100644 index 00000000..fcfcf9eb --- /dev/null +++ b/vendor/laminas/laminas-validator/src/CreditCard.php @@ -0,0 +1,455 @@ + 'The input seems to contain an invalid checksum', + self::CONTENT => 'The input must contain only digits', + self::INVALID => 'Invalid type given. String expected', + self::LENGTH => 'The input contains an invalid amount of digits', + self::PREFIX => 'The input is not from an allowed institute', + self::SERVICE => 'The input seems to be an invalid credit card number', + self::SERVICEFAILURE => 'An exception has been raised while validating the input', + ]; + + /** + * List of CCV names + * + * @var array + */ + protected $cardName = [ + 0 => self::AMERICAN_EXPRESS, + 1 => self::DINERS_CLUB, + 2 => self::DINERS_CLUB_US, + 3 => self::DISCOVER, + 4 => self::JCB, + 5 => self::LASER, + 6 => self::MAESTRO, + 7 => self::MASTERCARD, + 8 => self::SOLO, + 9 => self::UNIONPAY, + 10 => self::VISA, + 11 => self::MIR, + ]; + + /** + * List of allowed CCV lengths + * + * @var array + */ + protected $cardLength = [ + self::AMERICAN_EXPRESS => [15], + self::DINERS_CLUB => [14], + self::DINERS_CLUB_US => [16], + self::DISCOVER => [16, 19], + self::JCB => [15, 16], + self::LASER => [16, 17, 18, 19], + self::MAESTRO => [12, 13, 14, 15, 16, 17, 18, 19], + self::MASTERCARD => [16], + self::SOLO => [16, 18, 19], + self::UNIONPAY => [16, 17, 18, 19], + self::VISA => [13, 16, 19], + self::MIR => [13, 16], + ]; + + /** + * List of accepted CCV provider tags + * + * @var array + */ + protected $cardType = [ + self::AMERICAN_EXPRESS => ['34', '37'], + self::DINERS_CLUB => ['300', '301', '302', '303', '304', '305', '36'], + self::DINERS_CLUB_US => ['54', '55'], + self::DISCOVER => [ + '6011', + '622126', + '622127', + '622128', + '622129', + '62213', + '62214', + '62215', + '62216', + '62217', + '62218', + '62219', + '6222', + '6223', + '6224', + '6225', + '6226', + '6227', + '6228', + '62290', + '62291', + '622920', + '622921', + '622922', + '622923', + '622924', + '622925', + '644', + '645', + '646', + '647', + '648', + '649', + '65', + ], + self::JCB => ['1800', '2131', '3528', '3529', '353', '354', '355', '356', '357', '358'], + self::LASER => ['6304', '6706', '6771', '6709'], + self::MAESTRO => [ + '5018', + '5020', + '5038', + '6304', + '6759', + '6761', + '6762', + '6763', + '6764', + '6765', + '6766', + '6772', + ], + self::MASTERCARD => [ + '2221', + '2222', + '2223', + '2224', + '2225', + '2226', + '2227', + '2228', + '2229', + '223', + '224', + '225', + '226', + '227', + '228', + '229', + '23', + '24', + '25', + '26', + '271', + '2720', + '51', + '52', + '53', + '54', + '55', + ], + self::SOLO => ['6334', '6767'], + self::UNIONPAY => [ + '622126', + '622127', + '622128', + '622129', + '62213', + '62214', + '62215', + '62216', + '62217', + '62218', + '62219', + '6222', + '6223', + '6224', + '6225', + '6226', + '6227', + '6228', + '62290', + '62291', + '622920', + '622921', + '622922', + '622923', + '622924', + '622925', + ], + self::VISA => ['4'], + self::MIR => ['2200', '2201', '2202', '2203', '2204'], + ]; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'service' => null, // Service callback for additional validation + 'type' => [], // CCIs which are accepted by validation + ]; + + /** + * Constructor + * + * @param string|array|Traversable $options OPTIONAL Type of CCI to allow + */ + public function __construct($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (! is_array($options)) { + $options = func_get_args(); + $temp['type'] = array_shift($options); + if (! empty($options)) { + $temp['service'] = array_shift($options); + } + + $options = $temp; + } + + if (! array_key_exists('type', $options)) { + $options['type'] = self::ALL; + } + + $this->setType($options['type']); + unset($options['type']); + + if (array_key_exists('service', $options)) { + $this->setService($options['service']); + unset($options['service']); + } + + parent::__construct($options); + } + + /** + * Returns a list of accepted CCIs + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getType() + { + return $this->options['type']; + } + + /** + * Sets CCIs which are accepted by validation + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $type Type to allow for validation + * @return CreditCard Provides a fluid interface + */ + public function setType($type) + { + $this->options['type'] = []; + return $this->addType($type); + } + + /** + * Adds a CCI to be accepted by validation + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $type Type to allow for validation + * @return $this Provides a fluid interface + */ + public function addType($type) + { + if (is_string($type)) { + $type = [$type]; + } + + foreach ($type as $typ) { + if ($typ === self::ALL) { + $this->options['type'] = array_keys($this->cardLength); + continue; + } + + if (in_array($typ, $this->options['type'])) { + continue; + } + + $constant = 'static::' . strtoupper($typ); + if (! defined($constant) || in_array(constant($constant), $this->options['type'])) { + continue; + } + $this->options['type'][] = constant($constant); + } + + return $this; + } + + /** + * Returns the actual set service + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return callable + */ + public function getService() + { + return $this->options['service']; + } + + /** + * Sets a new callback for service validation + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param callable $service + * @return $this + * @throws InvalidArgumentException On invalid service callback. + */ + public function setService($service) + { + if (! is_callable($service)) { + throw new InvalidArgumentException('Invalid callback given'); + } + + $this->options['service'] = $service; + return $this; + } + + // The following rule is buggy for parameters attributes + // phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHintSpacing.NoSpaceBetweenTypeHintAndParameter + + /** + * Returns true if and only if $value follows the Luhn algorithm (mod-10 checksum) + * + * @param mixed $value + * @return bool + */ + public function isValid( + #[SensitiveParameter] + $value + ) { + $this->setValue($value); + + if (! is_string($value)) { + $this->error(self::INVALID, $value); + return false; + } + + if (! ctype_digit($value)) { + $this->error(self::CONTENT, $value); + return false; + } + + $length = strlen($value); + $types = $this->getType(); + $foundp = false; + $foundl = false; + foreach ($types as $type) { + foreach ($this->cardType[$type] as $prefix) { + if (str_starts_with($value, (string) $prefix)) { + $foundp = true; + if (in_array($length, $this->cardLength[$type])) { + $foundl = true; + break 2; + } + } + } + } + + if ($foundp === false) { + $this->error(self::PREFIX, $value); + return false; + } + + if ($foundl === false) { + $this->error(self::LENGTH, $value); + return false; + } + + $sum = 0; + $weight = 2; + + for ($i = $length - 2; $i >= 0; $i--) { + $digit = $weight * $value[$i]; + $sum += floor($digit / 10) + $digit % 10; + $weight = $weight % 2 + 1; + } + + $checksum = (10 - $sum % 10) % 10; + if ((string) $checksum !== $value[$length - 1]) { + $this->error(self::CHECKSUM, $value); + return false; + } + + $service = $this->getService(); + if (! empty($service)) { + try { + $callback = new Callback($service); + $callback->setOptions($this->getType()); + if (! $callback->isValid($value)) { + $this->error(self::SERVICE, $value); + return false; + } + } catch (Exception) { + $this->error(self::SERVICEFAILURE, $value); + return false; + } + } + + return true; + } + + // phpcs:enable SlevomatCodingStandard.TypeHints.ParameterTypeHintSpacing.NoSpaceBetweenTypeHintAndParameter +} diff --git a/vendor/laminas/laminas-validator/src/Csrf.php b/vendor/laminas/laminas-validator/src/Csrf.php new file mode 100644 index 00000000..e49bb681 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Csrf.php @@ -0,0 +1,382 @@ + 'The form submitted did not originate from the expected site', + ]; + + /** + * Actual hash used. + * + * @var mixed + */ + protected $hash; + + /** + * Static cache of the session names to generated hashes + * + * @todo unused, left here to avoid BC breaks + * @var array + */ + protected static $hashCache; + + /** + * Name of CSRF element (used to create non-colliding hashes) + * + * @var string + */ + protected $name = 'csrf'; + + /** + * Salt for CSRF token + * + * @var string + */ + protected $salt = 'salt'; + + /** @var SessionContainer */ + protected $session; + + /** + * TTL for CSRF token + * + * @var int|null + */ + protected $timeout = 300; + + /** + * Constructor + * + * @param array|Traversable $options + */ + public function __construct($options = []) + { + parent::__construct($options); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (! is_array($options)) { + $options = (array) $options; + } + + foreach ($options as $key => $value) { + switch (strtolower($key)) { + case 'name': + $this->setName($value); + break; + case 'salt': + $this->setSalt($value); + break; + case 'session': + $this->setSession($value); + break; + case 'timeout': + $this->setTimeout($value); + break; + default: + // ignore unknown options + break; + } + } + } + + /** + * Does the provided token match the one generated? + * + * @param mixed $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if (! is_string($value)) { + return false; + } + + $this->setValue($value); + + $tokenId = $this->getTokenIdFromHash($value); + $hash = $this->getValidationToken($tokenId); + + $tokenFromValue = $this->getTokenFromHash($value); + $tokenFromHash = $this->getTokenFromHash($hash); + + if ($tokenFromValue === null || $tokenFromHash === null || ($tokenFromValue !== $tokenFromHash)) { + $this->error(self::NOT_SAME); + return false; + } + + return true; + } + + /** + * Set CSRF name + * + * @param string $name + * @return $this + */ + public function setName($name) + { + $this->name = (string) $name; + return $this; + } + + /** + * Get CSRF name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set session container + * + * @return $this + */ + public function setSession(SessionContainer $session) + { + $this->session = $session; + if ($this->hash) { + $this->initCsrfToken(); + } + return $this; + } + + /** + * Get session container + * + * Instantiate session container if none currently exists + * + * @return SessionContainer + */ + public function getSession() + { + if (null === $this->session) { + // Using fully qualified name, to ensure polyfill class alias is used + $this->session = new SessionContainer($this->getSessionName()); + } + return $this->session; + } + + /** + * Salt for CSRF token + * + * @param string $salt + * @return $this + */ + public function setSalt($salt) + { + $this->salt = (string) $salt; + return $this; + } + + /** + * Retrieve salt for CSRF token + * + * @return string + */ + public function getSalt() + { + return $this->salt; + } + + /** + * Retrieve CSRF token + * + * If no CSRF token currently exists, or should be regenerated, + * generates one. + * + * @param bool $regenerate default false + * @return string + */ + public function getHash($regenerate = false) + { + if ((null === $this->hash) || $regenerate) { + $this->generateHash(); + } + return $this->hash; + } + + /** + * Get session namespace for CSRF token + * + * Generates a session namespace based on salt, element name, and class. + * + * @return string + */ + public function getSessionName() + { + return str_replace('\\', '_', self::class) . '_' + . $this->getSalt() . '_' + . strtr($this->getName(), ['[' => '_', ']' => '']); + } + + /** + * Set timeout for CSRF session token + * + * @param int|null $ttl + * @return $this + */ + public function setTimeout($ttl) + { + $this->timeout = $ttl !== null ? (int) $ttl : null; + return $this; + } + + /** + * Get CSRF session token timeout + * + * @return int|null + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * Initialize CSRF token in session + * + * @return void + */ + protected function initCsrfToken() + { + $session = $this->getSession(); + $timeout = $this->getTimeout(); + if (null !== $timeout) { + $session->setExpirationSeconds($timeout); + } + + $hash = $this->getHash(); + $token = $this->getTokenFromHash($hash); + $tokenId = $this->getTokenIdFromHash($hash); + + if (! $session->tokenList) { + $session->tokenList = []; + } + $session->tokenList[$tokenId] = $token; + $session->hash = $hash; // @todo remove this, left for BC + } + + /** + * Generate CSRF token + * + * Generates CSRF token and stores both in {@link $hash} and element + * value. + * + * @return void + */ + protected function generateHash() + { + $token = md5($this->getSalt() . random_bytes(32) . $this->getName()); + + $this->hash = $this->formatHash($token, $this->generateTokenId()); + + $this->setValue($this->hash); + $this->initCsrfToken(); + } + + /** + * @return string + */ + protected function generateTokenId() + { + return md5(random_bytes(32)); + } + + /** + * Get validation token + * + * Retrieve token from session, if it exists. + * + * @param string $tokenId + * @return null|string + */ + protected function getValidationToken($tokenId = null) + { + $session = $this->getSession(); + + /** + * if no tokenId is passed we revert to the old behaviour + * + * @todo remove, here for BC + */ + if ($tokenId === null && isset($session->hash)) { + return $session->hash; + } + + if ($tokenId !== null && isset($session->tokenList[$tokenId])) { + return $this->formatHash($session->tokenList[$tokenId], $tokenId); + } + + return null; + } + + /** + * @return string + */ + protected function formatHash(string $token, string $tokenId) + { + return sprintf('%s-%s', $token, $tokenId); + } + + protected function getTokenFromHash(?string $hash): ?string + { + if (null === $hash) { + return null; + } + + $data = explode('-', $hash); + return $data[0] ?: null; + } + + protected function getTokenIdFromHash(string $hash): ?string + { + $data = explode('-', $hash); + + if (! isset($data[1])) { + return null; + } + + return $data[1]; + } +} diff --git a/vendor/laminas/laminas-validator/src/Date.php b/vendor/laminas/laminas-validator/src/Date.php new file mode 100644 index 00000000..c3622a28 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Date.php @@ -0,0 +1,245 @@ + 'Invalid type given. String, integer, array or DateTime expected', + self::INVALID_DATE => 'The input does not appear to be a valid date', + self::FALSEFORMAT => "The input does not fit the date format '%format%'", + ]; + + /** @var string[] */ + protected $messageVariables = [ + 'format' => 'format', + ]; + + /** @var string */ + protected $format = self::FORMAT_DEFAULT; + + /** @var bool */ + protected $strict = false; + + /** + * Sets validator options + * + * @param string|array|Traversable $options OPTIONAL + */ + public function __construct($options = []) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } elseif (! is_array($options)) { + $options = func_get_args(); + $temp['format'] = array_shift($options); + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Returns the format option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return string + */ + public function getFormat() + { + return $this->format; + } + + /** + * Sets the format option + * + * Format cannot be null. It will always default to 'Y-m-d', even + * if null is provided. + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param string|null $format + * @return $this provides a fluent interface + * @todo validate the format + */ + public function setFormat($format = self::FORMAT_DEFAULT) + { + $this->format = $format === null || $format === '' ? self::FORMAT_DEFAULT : $format; + return $this; + } + + /** + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + */ + public function setStrict(bool $strict): self + { + $this->strict = $strict; + return $this; + } + + /** + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + */ + public function isStrict(): bool + { + return $this->strict; + } + + /** + * Returns true if $value is a DateTimeInterface instance or can be converted into one. + * + * @param string|numeric|array|DateTimeInterface $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + $date = $this->convertToDateTime($value); + if (! $date) { + $this->error(self::INVALID_DATE); + return false; + } + + if ($this->isStrict() && $date->format($this->getFormat()) !== $value) { + $this->error(self::FALSEFORMAT); + return false; + } + + return true; + } + + /** + * Attempts to convert an int, string, or array to a DateTime object + * + * @param string|numeric|array|DateTimeInterface $param + * @param bool $addErrors + * @return false|DateTime + */ + protected function convertToDateTime($param, $addErrors = true) + { + if ($param instanceof DateTime) { + return $param; + } + + if ($param instanceof DateTimeImmutable) { + return DateTime::createFromImmutable($param); + } + + $type = gettype($param); + switch ($type) { + case 'string': + return $this->convertString($param, $addErrors); + case 'integer': + return $this->convertInteger($param); + case 'double': + return $this->convertDouble($param); + case 'array': + return $this->convertArray($param, $addErrors); + } + + if ($addErrors) { + $this->error(self::INVALID); + } + + return false; + } + + /** + * Attempts to convert an integer into a DateTime object + * + * @param integer $value + * @return false|DateTime + */ + protected function convertInteger($value) + { + return DateTime::createFromFormat('U', (string) $value); + } + + /** + * Attempts to convert an double into a DateTime object + * + * @param double $value + * @return false|DateTime + */ + protected function convertDouble($value) + { + return DateTime::createFromFormat('U', (string) $value); + } + + /** + * Attempts to convert a string into a DateTime object + * + * @param string $value + * @param bool $addErrors + * @return false|DateTime + */ + protected function convertString($value, $addErrors = true) + { + $date = DateTime::createFromFormat($this->format, $value); + + // Invalid dates can show up as warnings (ie. "2007-02-99") + // and still return a DateTime object. + $errors = DateTime::getLastErrors(); + if ($errors === false) { + return $date; + } + + if ($errors['warning_count'] > 0) { + if ($addErrors) { + $this->error(self::FALSEFORMAT); + } + return false; + } + + return $date; + } + + /** + * Implodes the array into a string and proxies to {@link convertString()}. + * + * @param bool $addErrors + * @return false|DateTime + * @todo enhance the implosion + */ + protected function convertArray(array $value, $addErrors = true) + { + return $this->convertString(implode('-', $value), $addErrors); + } +} diff --git a/vendor/laminas/laminas-validator/src/DateComparison.php b/vendor/laminas/laminas-validator/src/DateComparison.php new file mode 100644 index 00000000..e3ab1c19 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/DateComparison.php @@ -0,0 +1,212 @@ + */ + protected array $messageTemplates = [ + self::ERROR_INVALID_TYPE => 'Expected a string or a date time instance but received "%type"', + self::ERROR_INVALID_DATE => 'Invalid date provided', + self::ERROR_NOT_GREATER_INCLUSIVE => 'A date equal to or after %min% is required', + self::ERROR_NOT_GREATER => 'A date after %min% is required', + self::ERROR_NOT_LESS_INCLUSIVE => 'A date equal to or before %max% is required', + self::ERROR_NOT_LESS => 'A date before %max% is required', + ]; + + /** @var array */ + protected array $messageVariables = [ + 'type' => 'type', + 'min' => 'minString', + 'max' => 'maxString', + ]; + + private readonly ?DateTimeInterface $min; + private readonly ?DateTimeInterface $max; + private readonly bool $inclusiveMin; + private readonly bool $inclusiveMax; + private readonly ?string $inputFormat; + + /** Input type used in message variables */ + protected ?string $type = null; + protected ?string $minString = null; + protected ?string $maxString = null; + + /** @param OptionsArgument $options */ + public function __construct(array $options = []) + { + parent::__construct($options); + + $this->min = $this->dateInstanceBound($options['min'] ?? null); + $this->max = $this->dateInstanceBound($options['max'] ?? null); + $this->inclusiveMin = $options['inclusiveMin'] ?? true; + $this->inclusiveMax = $options['inclusiveMax'] ?? true; + $this->inputFormat = $options['inputFormat'] ?? null; + + if ($this->min === null && $this->max === null) { + throw new InvalidArgumentException( + 'At least one date boundary must be supplied', + ); + } + + $outputFormat = $this->inputFormat ?? 'jS F Y H:i:s'; + + if ($this->min !== null) { + $this->minString = $this->min->format($outputFormat); + } + + if ($this->max !== null) { + $this->maxString = $this->max->format($outputFormat); + } + } + + public function isValid(mixed $value): bool + { + $this->type = get_debug_type($value); + $this->value = $value; + + if (! is_string($value) && ! $value instanceof DateTimeInterface) { + $this->error(self::ERROR_INVALID_TYPE); + + return false; + } + + $date = $this->valueToDate($value); + if ($date === null) { + $this->error(self::ERROR_INVALID_DATE); + + return false; + } + + if ($this->min !== null && $this->inclusiveMin && $date < $this->min) { + $this->error(self::ERROR_NOT_GREATER_INCLUSIVE); + + return false; + } + + if ($this->min !== null && ! $this->inclusiveMin && $date <= $this->min) { + $this->error(self::ERROR_NOT_GREATER); + + return false; + } + + if ($this->max !== null && $this->inclusiveMax && $date > $this->max) { + $this->error(self::ERROR_NOT_LESS_INCLUSIVE); + + return false; + } + + if ($this->max !== null && ! $this->inclusiveMax && $date >= $this->max) { + $this->error(self::ERROR_NOT_LESS); + + return false; + } + + return true; + } + + private function valueToDate(string|DateTimeInterface $input): DateTimeInterface|null + { + if ($input instanceof DateTimeInterface) { + return $this->w3cDateFromString($input->format('Y-m-d\TH:i:s')); + } + + if ($this->inputFormat !== null) { + $date = DateTimeImmutable::createFromFormat($this->inputFormat, $input, new DateTimeZone('UTC')); + + if ($date instanceof DateTimeImmutable) { + return $date; + } + } + + $date = $this->isoDateFromString($input); + if ($date !== null) { + return $date; + } + + $date = $this->w3cDateFromString($input); + if ($date !== null) { + return $date; + } + + return null; + } + + private function dateInstanceBound(string|DateTimeInterface|null $dateTime): DateTimeInterface|null + { + if ($dateTime instanceof DateTimeInterface) { + return $this->w3cDateFromString($dateTime->format('Y-m-d\TH:i:s')); + } + + if ($dateTime === null) { + return null; + } + + $date = $this->isoDateFromString($dateTime); + if ($date !== null) { + return $date; + } + + $date = $this->w3cDateFromString($dateTime); + if ($date !== null) { + return $date; + } + + throw new InvalidArgumentException( + 'Min/max date bounds must be either DateTime instances, or a string in one of the formats: ' + . '"Y-m-d" for a date or "Y-m-d\TH:i:s" for date time', + ); + } + + private function isoDateFromString(string $input): DateTimeImmutable|null + { + if (! preg_match('/^\d{4}-[0-1]\d-[0-3]\d$/', $input)) { + return null; + } + + $date = DateTimeImmutable::createFromFormat('!Y-m-d', $input, new DateTimeZone('UTC')); + assert($date !== false); + + return $date; + } + + private function w3cDateFromString(string $input): DateTimeImmutable|null + { + if (! preg_match('/^\d{4}-[0-1]\d-[0-3]\dT\d{1,2}:[0-5]\d:[0-5]\d$/', $input)) { + return null; + } + + $date = DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s', $input, new DateTimeZone('UTC')); + assert($date !== false); + + return $date; + } +} diff --git a/vendor/laminas/laminas-validator/src/DateStep.php b/vendor/laminas/laminas-validator/src/DateStep.php new file mode 100644 index 00000000..bcf41a28 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/DateStep.php @@ -0,0 +1,540 @@ + 'Invalid type given. String, integer, array or DateTime expected', + self::INVALID_DATE => 'The input does not appear to be a valid date', + self::FALSEFORMAT => "The input does not fit the date format '%format%'", + self::NOT_STEP => 'The input is not a valid step', + ]; + + /** + * Optional base date value + * + * @var string|int|DateTimeInterface + */ + protected $baseValue = '1970-01-01T00:00:00Z'; + + /** + * Date step interval (defaults to 1 day). + * Uses the DateInterval specification. + * + * @var DateInterval + */ + protected $step; + + /** + * Optional timezone to be used when the baseValue + * and validation values do not contain timezone info + * + * @deprecated Since 2.61.0 - The timezone option is unused + * + * @var DateTimeZone + */ + protected $timezone; + + /** + * Set default options for this instance + * + * @param string|array|Traversable $options + */ + public function __construct($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (! is_array($options)) { + $options = func_get_args(); + $temp = []; + $temp['baseValue'] = array_shift($options); + if (! empty($options)) { + $temp['step'] = array_shift($options); + } + if (! empty($options)) { + $temp['format'] = array_shift($options); + } + if (! empty($options)) { + $temp['timezone'] = array_shift($options); + } + + $options = $temp; + } + + if (! isset($options['step'])) { + $options['step'] = new DateInterval('P1D'); + } + if (! isset($options['timezone'])) { + $options['timezone'] = new DateTimeZone(date_default_timezone_get()); + } + + parent::__construct($options); + } + + /** + * Sets the base value from which the step should be computed + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param string|int|DateTimeInterface $baseValue + * @return $this + */ + public function setBaseValue($baseValue) + { + $this->baseValue = $baseValue; + return $this; + } + + /** + * Returns the base value from which the step should be computed + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return string|int|DateTimeInterface + */ + public function getBaseValue() + { + return $this->baseValue; + } + + /** + * Sets the step date interval + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return $this + */ + public function setStep(DateInterval $step) + { + $this->step = $step; + return $this; + } + + /** + * Returns the step date interval + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return DateInterval + */ + public function getStep() + { + return $this->step; + } + + /** + * Returns the timezone option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return DateTimeZone + */ + public function getTimezone() + { + return $this->timezone; + } + + /** + * Sets the timezone option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return $this + */ + public function setTimezone(DateTimeZone $timezone) + { + $this->timezone = $timezone; + return $this; + } + + /** + * Supports formats with ISO week (W) definitions + * + * @see Date::convertString() + * + * @param string $value + * @param bool $addErrors + * @return DateTime|false + */ + protected function convertString($value, $addErrors = true) + { + // Custom week format support + if ( + str_starts_with($this->format, 'Y-\WW') + && preg_match('/^([0-9]{4})\-W([0-9]{2})/', $value, $matches) + ) { + $date = new DateTime(); + $date->setISODate((int) $matches[1], (int) $matches[2]); + } else { + $date = DateTime::createFromFormat($this->format, $value, new DateTimeZone('UTC')); + } + + // Invalid dates can show up as warnings (ie. "2007-02-99") + // and still return a DateTime object. + $errors = DateTime::getLastErrors(); + if (is_array($errors) && $errors['warning_count'] > 0) { + if ($addErrors) { + $this->error(self::FALSEFORMAT); + } + return false; + } + + return $date; + } + + /** + * Returns true if a date is within a valid step + * + * @param string|int|DateTimeInterface $value + * @return bool + * @throws Exception\InvalidArgumentException + */ + public function isValid($value) + { + if (! parent::isValid($value)) { + return false; + } + + $valueDate = $this->convertToDateTime($value, false); // avoid duplicate errors + $baseDate = $this->convertToDateTime($this->baseValue, false); + + if (false === $valueDate || false === $baseDate) { + return false; + } + + $step = $this->getStep(); + + // Same date? + // phpcs:ignore SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedEqualOperator + if ($valueDate == $baseDate) { + return true; + } + + // Optimization for simple intervals. + // Handle intervals of just one date or time unit. + $intervalParts = explode('|', $step->format('%y|%m|%d|%h|%i|%s')); + $intervalParts = array_map('intval', $intervalParts); + $partCounts = array_count_values($intervalParts); + + $unitKeys = ['years', 'months', 'days', 'hours', 'minutes', 'seconds']; + $intervalParts = array_combine($unitKeys, $intervalParts); + + // Get absolute time difference to avoid special cases of missing/added time + $absoluteValueDate = new DateTime($valueDate->format('Y-m-d H:i:s'), new DateTimeZone('UTC')); + $absoluteBaseDate = new DateTime($baseDate->format('Y-m-d H:i:s'), new DateTimeZone('UTC')); + + $timeDiff = $absoluteValueDate->diff($absoluteBaseDate, true); + $diffParts = array_map('intval', explode('|', $timeDiff->format('%y|%m|%d|%h|%i|%s'))); + $diffParts = array_combine($unitKeys, $diffParts); + + if (5 === $partCounts[0]) { + // Find the unit with the non-zero interval + $intervalUnit = 'days'; + $stepValue = 1; + foreach ($intervalParts as $key => $value) { + if (0 !== $value) { + $intervalUnit = $key; + $stepValue = $value; + break; + } + } + + // Check date units + if (in_array($intervalUnit, ['years', 'months', 'days'])) { + switch ($intervalUnit) { + case 'years': + if ( + 0 === $diffParts['months'] && 0 === $diffParts['days'] + && 0 === $diffParts['hours'] && 0 === $diffParts['minutes'] + && 0 === $diffParts['seconds'] + ) { + if (($diffParts['years'] % $stepValue) === 0) { + return true; + } + } + break; + case 'months': + if ( + 0 === $diffParts['days'] && 0 === $diffParts['hours'] + && 0 === $diffParts['minutes'] && 0 === $diffParts['seconds'] + ) { + $months = ($diffParts['years'] * 12) + $diffParts['months']; + if (($months % $stepValue) === 0) { + return true; + } + } + break; + case 'days': + if ( + 0 === $diffParts['hours'] && 0 === $diffParts['minutes'] + && 0 === $diffParts['seconds'] + ) { + $days = (int) $timeDiff->format('%a'); // Total days + if (($days % $stepValue) === 0) { + return true; + } + } + break; + } + $this->error(self::NOT_STEP); + return false; + } + + // Check time units + if (in_array($intervalUnit, ['hours', 'minutes', 'seconds'])) { + // Simple test if $stepValue is 1. + if (1 === $stepValue) { + if ( + 'hours' === $intervalUnit + && 0 === $diffParts['minutes'] && 0 === $diffParts['seconds'] + ) { + return true; + } elseif ('minutes' === $intervalUnit && 0 === $diffParts['seconds']) { + return true; + } elseif ('seconds' === $intervalUnit) { + return true; + } + + $this->error(self::NOT_STEP); + + return false; + } + + // Simple test for same day, when using default baseDate + if ( + $baseDate->format('Y-m-d') === $valueDate->format('Y-m-d') + && $baseDate->format('Y-m-d') === '1970-01-01' + ) { + switch ($intervalUnit) { + case 'hours': + if (0 === $diffParts['minutes'] && 0 === $diffParts['seconds']) { + if (($diffParts['hours'] % $stepValue) === 0) { + return true; + } + } + break; + case 'minutes': + if (0 === $diffParts['seconds']) { + $minutes = ($diffParts['hours'] * 60) + $diffParts['minutes']; + if (($minutes % $stepValue) === 0) { + return true; + } + } + break; + case 'seconds': + $seconds = ($diffParts['hours'] * 60 * 60) + + ($diffParts['minutes'] * 60) + + $diffParts['seconds']; + if (($seconds % $stepValue) === 0) { + return true; + } + break; + } + $this->error(self::NOT_STEP); + return false; + } + } + } + + return $this->fallbackIncrementalIterationLogic($baseDate, $valueDate, $intervalParts, $diffParts, $step); + } + + /** + * Fall back to slower (but accurate) method for complex intervals. + * Keep adding steps to the base date until a match is found + * or until the value is exceeded. + * + * This is really slow if the interval is small, especially if the + * default base date of 1/1/1970 is used. We can skip a chunk of + * iterations by starting at the lower bound of steps needed to reach + * the target + * + * @param int[] $intervalParts + * @param int[] $diffParts + * @throws Exception\InvalidArgumentException + */ + private function fallbackIncrementalIterationLogic( + DateTimeInterface $baseDate, + DateTimeInterface $valueDate, + array $intervalParts, + array $diffParts, + DateInterval $step + ): bool { + [$minSteps, $requiredIterations] = $this->computeMinStepAndRequiredIterations($intervalParts, $diffParts); + $minimumInterval = $this->computeMinimumInterval($intervalParts, $minSteps); + $isIncrementalStepping = $baseDate < $valueDate; + + if (! ($baseDate instanceof DateTime || $baseDate instanceof DateTimeImmutable)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Function %s requires the baseDate to be a DateTime or DateTimeImmutable instance.', + __FUNCTION__ + )); + } + + for ($offsetIterations = 0; $offsetIterations < $requiredIterations; $offsetIterations += 1) { + if ($isIncrementalStepping) { + $baseDate = $baseDate->add($minimumInterval); + } else { + $baseDate = $baseDate->sub($minimumInterval); + } + } + + while ( + ($isIncrementalStepping && $baseDate < $valueDate) + || (! $isIncrementalStepping && $baseDate > $valueDate) + ) { + if ($isIncrementalStepping) { + $baseDate = $baseDate->add($step); + } else { + $baseDate = $baseDate->sub($step); + } + + // phpcs:ignore SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedEqualOperator + if ($baseDate == $valueDate) { + return true; + } + } + + $this->error(self::NOT_STEP); + + return false; + } + + /** + * Computes minimum interval to use for iterations while checking steps + * + * @param int[] $intervalParts + * @param int|float $minSteps + */ + private function computeMinimumInterval(array $intervalParts, $minSteps): DateInterval + { + return new DateInterval(sprintf( + 'P%dY%dM%dDT%dH%dM%dS', + $intervalParts['years'] * $minSteps, + $intervalParts['months'] * $minSteps, + $intervalParts['days'] * $minSteps, + $intervalParts['hours'] * $minSteps, + $intervalParts['minutes'] * $minSteps, + $intervalParts['seconds'] * $minSteps + )); + } + + /** + * @param int[] $intervalParts + * @param int[] $diffParts + * @return int[] (ordered tuple containing minimum steps and required step iterations + * @psalm-return array{0: int, 1: int} + */ + private function computeMinStepAndRequiredIterations(array $intervalParts, array $diffParts): array + { + $minSteps = $this->computeMinSteps($intervalParts, $diffParts); + + // If we use PHP_INT_MAX DateInterval::__construct falls over with a bad format error + // before we reach the max on 64 bit machines + $maxInteger = min(2 ** 31, PHP_INT_MAX); + // check for integer overflow and split $minimum interval if needed + $maximumInterval = max($intervalParts); + $requiredStepIterations = 1; + + if (($minSteps * $maximumInterval) > $maxInteger) { + $requiredStepIterations = ceil(($minSteps * $maximumInterval) / $maxInteger); + $minSteps = floor($minSteps / $requiredStepIterations); + } + + return [(int) $minSteps, $minSteps !== 0 ? (int) $requiredStepIterations : 0]; + } + + /** + * Multiply the step interval by the lower bound of steps to reach the target + * + * @param int[] $intervalParts + * @param int[] $diffParts + * @return float|int + */ + private function computeMinSteps(array $intervalParts, array $diffParts) + { + $intervalMaxSeconds = $this->computeIntervalMaxSeconds($intervalParts); + + return 0 === $intervalMaxSeconds + ? 0 + : max(floor($this->computeDiffMinSeconds($diffParts) / $intervalMaxSeconds) - 1, 0); + } + + /** + * Get upper bound of the given interval in seconds + * Converts a given `$intervalParts` array into seconds + * + * @param int[] $intervalParts + */ + private function computeIntervalMaxSeconds(array $intervalParts): int + { + return ($intervalParts['years'] * 60 * 60 * 24 * 366) + + ($intervalParts['months'] * 60 * 60 * 24 * 31) + + ($intervalParts['days'] * 60 * 60 * 24) + + ($intervalParts['hours'] * 60 * 60) + + ($intervalParts['minutes'] * 60) + + $intervalParts['seconds']; + } + + /** + * Get lower bound of difference in secondss + * Converts a given `$diffParts` array into seconds + * + * @param int[] $diffParts + */ + private function computeDiffMinSeconds(array $diffParts): int + { + return ($diffParts['years'] * 60 * 60 * 24 * 365) + + ($diffParts['months'] * 60 * 60 * 24 * 28) + + ($diffParts['days'] * 60 * 60 * 24) + + ($diffParts['hours'] * 60 * 60) + + ($diffParts['minutes'] * 60) + + $diffParts['seconds']; + } +} diff --git a/vendor/laminas/laminas-validator/src/Db/AbstractDb.php b/vendor/laminas/laminas-validator/src/Db/AbstractDb.php new file mode 100755 index 00000000..54ac7f15 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Db/AbstractDb.php @@ -0,0 +1,317 @@ + Message templates */ + protected $messageTemplates = [ + self::ERROR_NO_RECORD_FOUND => 'No record matching the input was found', + self::ERROR_RECORD_FOUND => 'A record matching the input was found', + ]; + + /** + * Select object to use. can be set, or will be auto-generated + * + * @var Select + */ + protected $select; + + /** @var string */ + protected $schema; + + /** @var string */ + protected $table = ''; + + /** @var string */ + protected $field = ''; + + /** @var mixed */ + protected $exclude; + + /** + * Provides basic configuration for use with Laminas\Validator\Db Validators + * Setting $exclude allows a single record to be excluded from matching. + * Exclude can either be a String containing a where clause, or an array with `field` and `value` keys + * to define the where clause added to the sql. + * A database adapter may optionally be supplied to avoid using the registered default adapter. + * + * The following option keys are supported: + * 'table' => The database table to validate against + * 'schema' => The schema keys + * 'field' => The field to check for a match + * 'exclude' => An optional where clause or field/value pair to exclude from the query + * 'adapter' => An optional database adapter to use + * + * @param array|Traversable|Select $options Options to use for this validator + * @throws InvalidArgumentException + */ + public function __construct($options = null) + { + parent::__construct($options); + + if ($options instanceof Select) { + $this->setSelect($options); + return; + } + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (func_num_args() > 1) { + $options = func_get_args(); + $firstArgument = array_shift($options); + if (is_array($firstArgument)) { + $temp = ArrayUtils::iteratorToArray($firstArgument); + } else { + $temp['table'] = $firstArgument; + } + + $temp['field'] = array_shift($options); + + if (! empty($options)) { + $temp['exclude'] = array_shift($options); + } + + if (! empty($options)) { + $temp['adapter'] = array_shift($options); + } + + $options = $temp; + } + + if (! array_key_exists('table', $options) && ! array_key_exists('schema', $options)) { + throw new Exception\InvalidArgumentException('Table or Schema option missing!'); + } + + if (! array_key_exists('field', $options)) { + throw new Exception\InvalidArgumentException('Field option missing!'); + } + + if (array_key_exists('adapter', $options)) { + $this->setAdapter($options['adapter']); + } + + if (array_key_exists('exclude', $options)) { + $this->setExclude($options['exclude']); + } + + $this->setField($options['field']); + if (array_key_exists('table', $options)) { + $this->setTable($options['table']); + } + + if (array_key_exists('schema', $options)) { + $this->setSchema($options['schema']); + } + } + + /** + * Returns the set adapter + * + * @throws RuntimeException When no database adapter is defined. + * @return DbAdapter + */ + public function getAdapter() + { + return $this->adapter; + } + + /** + * Sets a new database adapter + * + * @return self Provides a fluent interface + */ + public function setAdapter(DbAdapter $adapter) + { + return $this->setDbAdapter($adapter); + } + + /** + * Returns the set exclude clause + * + * @return string|array + */ + public function getExclude() + { + return $this->exclude; + } + + /** + * Sets a new exclude clause + * + * @param string|array $exclude + * @return $this Provides a fluent interface + */ + public function setExclude($exclude) + { + $this->exclude = $exclude; + $this->select = null; + return $this; + } + + /** + * Returns the set field + * + * @return string|array + */ + public function getField() + { + return $this->field; + } + + /** + * Sets a new field + * + * @param string $field + * @return $this + */ + public function setField($field) + { + $this->field = (string) $field; + $this->select = null; + return $this; + } + + /** + * Returns the set table + * + * @return string + */ + public function getTable() + { + return $this->table; + } + + /** + * Sets a new table + * + * @param string $table + * @return $this Provides a fluent interface + */ + public function setTable($table) + { + $this->table = (string) $table; + $this->select = null; + return $this; + } + + /** + * Returns the set schema + * + * @return string + */ + public function getSchema() + { + return $this->schema; + } + + /** + * Sets a new schema + * + * @param string $schema + * @return $this Provides a fluent interface + */ + public function setSchema($schema) + { + $this->schema = $schema; + $this->select = null; + return $this; + } + + /** + * Sets the select object to be used by the validator + * + * @return $this Provides a fluent interface + */ + public function setSelect(Select $select) + { + $this->select = $select; + return $this; + } + + /** + * Gets the select object to be used by the validator. + * If no select object was supplied to the constructor, + * then it will auto-generate one from the given table, + * schema, field, and adapter options. + * + * @return Select The Select object which will be used + */ + public function getSelect() + { + if ($this->select instanceof Select) { + return $this->select; + } + + // Build select object + $select = new Select(); + $tableIdentifier = new TableIdentifier($this->table, $this->schema); + $select->from($tableIdentifier)->columns([$this->field]); + $select->where->equalTo($this->field, null); + + if ($this->exclude !== null) { + if (is_array($this->exclude)) { + $select->where->notEqualTo( + $this->exclude['field'], + $this->exclude['value'] + ); + } else { + $select->where($this->exclude); + } + } + + $this->select = $select; + + return $this->select; + } + + /** + * Run query and returns matches, or null if no matches are found. + * + * @param string $value + * @return array when matches are found. + */ + protected function query($value) + { + $sql = new Sql($this->getAdapter()); + $select = $this->getSelect(); + $statement = $sql->prepareStatementForSqlObject($select); + $parameters = $statement->getParameterContainer(); + $parameters['where1'] = $value; + $result = $statement->execute(); + + return $result->current(); + } +} diff --git a/vendor/laminas/laminas-validator/src/Db/NoRecordExists.php b/vendor/laminas/laminas-validator/src/Db/NoRecordExists.php new file mode 100644 index 00000000..23a75ae9 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Db/NoRecordExists.php @@ -0,0 +1,38 @@ +adapter) { + throw new Exception\RuntimeException('No database adapter present'); + } + + $valid = true; + $this->setValue($value); + + $result = $this->query($value); + if ($result) { + $valid = false; + $this->error(self::ERROR_RECORD_FOUND); + } + + return $valid; + } +} diff --git a/vendor/laminas/laminas-validator/src/Db/RecordExists.php b/vendor/laminas/laminas-validator/src/Db/RecordExists.php new file mode 100644 index 00000000..e8aac19b --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Db/RecordExists.php @@ -0,0 +1,38 @@ +adapter) { + throw new Exception\RuntimeException('No database adapter present'); + } + + $valid = true; + $this->setValue($value); + + $result = $this->query($value); + if (! $result) { + $valid = false; + $this->error(self::ERROR_NO_RECORD_FOUND); + } + + return $valid; + } +} diff --git a/vendor/laminas/laminas-validator/src/Digits.php b/vendor/laminas/laminas-validator/src/Digits.php new file mode 100644 index 00000000..97a9caa7 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Digits.php @@ -0,0 +1,67 @@ + 'The input must contain only digits', + self::STRING_EMPTY => 'The input is an empty string', + self::INVALID => 'Invalid type given. String, integer or float expected', + ]; + + /** + * Returns true if and only if $value only contains digit characters + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value) && ! is_int($value) && ! is_float($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue((string) $value); + + if ('' === $this->getValue()) { + $this->error(self::STRING_EMPTY); + return false; + } + + if (null === static::$filter) { + static::$filter = new DigitsFilter(); + } + + if ($this->getValue() !== static::$filter->filter($this->getValue())) { + $this->error(self::NOT_DIGITS); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/EmailAddress.php b/vendor/laminas/laminas-validator/src/EmailAddress.php new file mode 100644 index 00000000..03ebe12c --- /dev/null +++ b/vendor/laminas/laminas-validator/src/EmailAddress.php @@ -0,0 +1,598 @@ + */ + protected $messageTemplates = [ + self::INVALID => "Invalid type given. String expected", + self::INVALID_FORMAT => "The input is not a valid email address. Use the basic format local-part@hostname", + self::INVALID_HOSTNAME => "'%hostname%' is not a valid hostname for the email address", + self::INVALID_MX_RECORD => "'%hostname%' does not appear to have any valid MX or A records for the email address", + self::INVALID_SEGMENT => "'%hostname%' is not in a routable network segment. The email address should not be resolved from public network", + self::DOT_ATOM => "'%localPart%' can not be matched against dot-atom format", + self::QUOTED_STRING => "'%localPart%' can not be matched against quoted-string format", + self::INVALID_LOCAL_PART => "'%localPart%' is not a valid local part for the email address", + self::LENGTH_EXCEEDED => "The input exceeds the allowed length", + ]; + + // phpcs:enable + + /** @var array */ + protected $messageVariables = [ + 'hostname' => 'hostname', + 'localPart' => 'localPart', + ]; + + /** @var string */ + protected $hostname; + + /** @var string */ + protected $localPart; + + /** + * Returns the found mx record information + * + * @var array + */ + protected $mxRecord = []; + + /** + * Internal options array + * + * @var array + */ + protected $options = [ + 'useMxCheck' => false, + 'useDeepMxCheck' => false, + 'useDomainCheck' => true, + 'allow' => Hostname::ALLOW_DNS, + 'strict' => true, + 'hostnameValidator' => null, + ]; + + /** + * Instantiates hostname validator for local use + * + * The following additional option keys are supported: + * 'hostnameValidator' => A hostname validator, see Laminas\Validator\Hostname + * 'allow' => Options for the hostname validator, see Laminas\Validator\Hostname::ALLOW_* + * 'strict' => Whether to adhere to strictest requirements in the spec + * 'useMxCheck' => If MX check should be enabled, boolean + * 'useDeepMxCheck' => If a deep MX check should be done, boolean + * + * @param array|Traversable $options OPTIONAL + */ + public function __construct($options = []) + { + if (! is_array($options)) { + $options = func_get_args(); + $temp['allow'] = array_shift($options); + if (! empty($options)) { + $temp['useMxCheck'] = array_shift($options); + } + + if (! empty($options)) { + $temp['hostnameValidator'] = array_shift($options); + } + + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Sets the validation failure message template for a particular key + * Adds the ability to set messages to the attached hostname validator + * + * @param string $messageString + * @param string $messageKey OPTIONAL + * @return AbstractValidator Provides a fluent interface + */ + public function setMessage($messageString, $messageKey = null) + { + if ($messageKey === null) { + $this->getHostnameValidator()->setMessage($messageString); + parent::setMessage($messageString); + return $this; + } + + if (! isset($this->messageTemplates[$messageKey])) { + $this->getHostnameValidator()->setMessage($messageString, $messageKey); + } else { + parent::setMessage($messageString, $messageKey); + } + + return $this; + } + + /** + * Returns the set hostname validator + * + * If was not previously set then lazy load a new one + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return Hostname + */ + public function getHostnameValidator() + { + if (! isset($this->options['hostnameValidator'])) { + $this->options['hostnameValidator'] = new Hostname($this->getAllow()); + } + + return $this->options['hostnameValidator']; + } + + /** + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param Hostname $hostnameValidator OPTIONAL + * @return $this Provides a fluent interface + */ + public function setHostnameValidator(?Hostname $hostnameValidator = null) + { + $this->options['hostnameValidator'] = $hostnameValidator; + + return $this; + } + + /** + * Returns the allow option of the attached hostname validator + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return int + */ + public function getAllow() + { + return $this->options['allow']; + } + + /** + * Sets the allow option of the hostname validator to use + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param int $allow + * @return $this Provides a fluent interface + */ + public function setAllow($allow) + { + $this->options['allow'] = $allow; + if (isset($this->options['hostnameValidator'])) { + $this->options['hostnameValidator']->setAllow($allow); + } + + return $this; + } + + /** + * Whether MX checking via getmxrr is supported or not + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return bool + */ + public function isMxSupported() + { + return function_exists('getmxrr'); + } + + /** + * Returns the set validateMx option + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getMxCheck() + { + return $this->options['useMxCheck']; + } + + /** + * Set whether we check for a valid MX record via DNS + * + * This only applies when DNS hostnames are validated + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param bool $mx Set allowed to true to validate for MX records, and false to not validate them + * @return $this Fluid Interface + */ + public function useMxCheck($mx) + { + $this->options['useMxCheck'] = (bool) $mx; + return $this; + } + + /** + * Returns the set deepMxCheck option + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getDeepMxCheck() + { + return $this->options['useDeepMxCheck']; + } + + /** + * Use deep validation for MX records + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param bool $deep Set deep to true to perform a deep validation process for MX records + * @return $this Fluid Interface + */ + public function useDeepMxCheck($deep) + { + $this->options['useDeepMxCheck'] = (bool) $deep; + return $this; + } + + /** + * Returns the set domainCheck option + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getDomainCheck() + { + return $this->options['useDomainCheck']; + } + + /** + * Sets if the domain should also be checked + * or only the local part of the email address + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param bool $domain + * @return $this Fluid Interface + */ + public function useDomainCheck($domain = true) + { + $this->options['useDomainCheck'] = (bool) $domain; + return $this; + } + + /** + * Returns whether the given host is a reserved IP, or a hostname that resolves to a reserved IP + * + * @param string $host + * @return bool Returns false when minimal one of the given addresses is not reserved + */ + protected function isReserved($host) + { + $validator = new HostWithPublicIPv4Address(); + return ! $validator->isValid($host); + } + + /** + * Internal method to validate the local part of the email address + * + * @return bool + */ + protected function validateLocalPart() + { + // First try to match the local part on the common dot-atom format + + // Dot-atom characters are: 1*atext *("." 1*atext) + // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*", + // "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~" + $atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d\x7e'; + if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->localPart)) { + return true; + } + + if ($this->validateInternationalizedLocalPart($this->localPart)) { + return true; + } + + // Try quoted string format (RFC 5321 Chapter 4.1.2) + + // Quoted-string characters are: DQUOTE *(qtext/quoted-pair) DQUOTE + $qtext = '\x20-\x21\x23-\x5b\x5d-\x7e'; // %d32-33 / %d35-91 / %d93-126 + $quotedPair = '\x20-\x7e'; // %d92 %d32-126 + if (preg_match('/^"([' . $qtext . ']|\x5c[' . $quotedPair . '])*"$/', $this->localPart)) { + return true; + } + + $this->error(self::DOT_ATOM); + $this->error(self::QUOTED_STRING); + $this->error(self::INVALID_LOCAL_PART); + + return false; + } + + /** + * @param string $localPart Address local part to validate. + * @return bool + */ + protected function validateInternationalizedLocalPart($localPart) + { + if ( + extension_loaded('intl') + && false === UConverter::transcode($localPart, 'UTF-8', 'UTF-8') + ) { + // invalid utf? + return false; + } + + $atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d\x7e'; + // RFC 6532 extends atext to include non-ascii utf + // @see https://tools.ietf.org/html/rfc6532#section-3.1 + $uatext = $atext . '\x{80}-\x{FFFF}'; + return (bool) preg_match('/^[' . $uatext . ']+(\x2e+[' . $uatext . ']+)*$/u', $localPart); + } + + /** + * Returns the found MX Record information after validation including weight for further processing + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return array + */ + public function getMXRecord() + { + return $this->mxRecord; + } + + /** + * Internal method to validate the servers MX records + * + * @return bool|string[] + * @psalm-return bool|list + */ + protected function validateMXRecords() + { + $mxHosts = []; + $weight = []; + $result = getmxrr($this->hostname, $mxHosts, $weight); + if (! empty($mxHosts) && ! empty($weight)) { + $this->mxRecord = array_combine($mxHosts, $weight) ?: []; + } else { + $this->mxRecord = []; + } + + arsort($this->mxRecord); + + // Fallback to IPv4 hosts if no MX record found (RFC 2821 SS 5). + if (! $result) { + $result = gethostbynamel($this->hostname); + if (is_array($result)) { + $this->mxRecord = array_flip($result); + } + } + + if ($result === false) { + $this->error(self::INVALID_MX_RECORD); + return false; + } + + if (! $this->options['useDeepMxCheck']) { + return $result; + } + + $validAddress = false; + $reserved = true; + foreach (array_keys($this->mxRecord) as $hostname) { + $res = $this->isReserved($hostname); + if (! $res) { + $reserved = false; + } + + if (trim($hostname) === '') { + continue; + } + + if ( + ! $res + && (checkdnsrr($hostname, 'A') + || checkdnsrr($hostname, 'AAAA') + || checkdnsrr($hostname, 'A6')) + ) { + $validAddress = true; + break; + } + } + + if (! $validAddress) { + $result = false; + $error = $reserved ? self::INVALID_SEGMENT : self::INVALID_MX_RECORD; + $this->error($error); + } + + return $result; + } + + /** + * Internal method to validate the hostname part of the email address + * + * @return bool|string[] + * @psalm-return bool|list + */ + protected function validateHostnamePart() + { + $hostname = $this->getHostnameValidator()->setTranslator($this->getTranslator()) + ->isValid($this->hostname); + if (! $hostname) { + $this->error(self::INVALID_HOSTNAME); + // Get messages and errors from hostnameValidator + foreach ($this->getHostnameValidator()->getMessages() as $code => $message) { + $this->abstractOptions['messages'][$code] = $message; + } + } elseif ($this->options['useMxCheck']) { + // MX check on hostname + $hostname = $this->validateMXRecords(); + } + + return $hostname; + } + + /** + * Splits the given value in hostname and local part of the email address + * + * @param string $value Email address to be split + * @return bool Returns false when the email can not be split + */ + protected function splitEmailParts($value) + { + $value = is_string($value) ? $value : ''; + + // Split email address up and disallow '..' + if ( + str_contains($value, '..') + || ! preg_match('/^(.+)@([^@]+)$/', $value, $matches) + ) { + return false; + } + + $this->localPart = $matches[1]; + $this->hostname = $this->idnToAscii($matches[2]); + + return true; + } + + /** + * Defined by Laminas\Validator\ValidatorInterface + * + * Returns true if and only if $value is a valid email address + * according to RFC2822 + * + * @link http://www.ietf.org/rfc/rfc2822.txt RFC2822 + * @link http://www.columbia.edu/kermit/ascii.html US-ASCII characters + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $length = true; + $this->setValue($value); + + // Split email address up and disallow '..' + if (! $this->splitEmailParts($this->getValue())) { + $this->error(self::INVALID_FORMAT); + return false; + } + + if ($this->getOption('strict') && (strlen($this->localPart) > 64) || (strlen($this->hostname) > 255)) { + $length = false; + $this->error(self::LENGTH_EXCEEDED); + } + + // Match hostname part + $hostname = false; + if ($this->options['useDomainCheck']) { + $hostname = $this->validateHostnamePart(); + } + + $local = $this->validateLocalPart(); + + // If both parts valid, return true + return ($local && $length) && (! $this->options['useDomainCheck'] || $hostname !== false); + } + + /** + * Safely convert UTF-8 encoded domain name to ASCII + * + * @param string $email the UTF-8 encoded email + * @return string + */ + protected function idnToAscii($email) + { + if (extension_loaded('intl')) { + if (defined('INTL_IDNA_VARIANT_UTS46')) { + $value = idn_to_ascii($email, 0, INTL_IDNA_VARIANT_UTS46); + + return $value !== false ? $value : $email; + } + $value = idn_to_ascii($email); + + return $value !== false ? $value : $email; + } + return $email; + } + + /** + * Safely convert ASCII encoded domain name to UTF-8 + * + * @param string $email the ASCII encoded email + * @return string + */ + protected function idnToUtf8($email) + { + if (strlen($email) === 0) { + return $email; + } + + if (extension_loaded('intl')) { + // The documentation does not clarify what kind of failure + // can happen in idn_to_utf8. One can assume if the source + // is not IDN encoded, it would fail, but it usually returns + // the source string in those cases. + // But not when the source string is long enough. + // Thus we default to source string ourselves. + if (defined('INTL_IDNA_VARIANT_UTS46')) { + $value = idn_to_utf8($email, 0, INTL_IDNA_VARIANT_UTS46); + + return $value !== false ? $value : $email; + } + $value = idn_to_utf8($email); + + return $value !== false ? $value : $email; + } + return $email; + } +} diff --git a/vendor/laminas/laminas-validator/src/Exception/BadMethodCallException.php b/vendor/laminas/laminas-validator/src/Exception/BadMethodCallException.php new file mode 100644 index 00000000..2896b12f --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Exception/BadMethodCallException.php @@ -0,0 +1,12 @@ + 'Invalid type given', + ]; + + /** @var array */ + protected $messageVariables = []; + + /** @var non-empty-string */ + protected $valueDelimiter = ','; + + /** @var ValidatorInterface|null */ + protected $validator; + + /** @var bool */ + protected $breakOnFirstFailure = false; + + /** + * Sets the delimiter string that the values will be split upon + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param non-empty-string $delimiter + * @return $this + */ + public function setValueDelimiter($delimiter) + { + $this->valueDelimiter = $delimiter; + return $this; + } + + /** + * Returns the delimiter string that the values will be split upon + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return non-empty-string + */ + public function getValueDelimiter() + { + return $this->valueDelimiter; + } + + /** + * Set validator plugin manager + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return void + */ + public function setValidatorPluginManager(ValidatorPluginManager $pluginManager) + { + $this->pluginManager = $pluginManager; + } + + /** + * Get validator plugin manager + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return ValidatorPluginManager + */ + public function getValidatorPluginManager() + { + if (! $this->pluginManager) { + $this->pluginManager = new ValidatorPluginManager(new ServiceManager()); + } + + return $this->pluginManager; + } + + /** + * Sets the Validator for validating each value + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param ValidatorInterface|ValidatorSpecification $validator + * @return $this + * @throws Exception\RuntimeException + */ + public function setValidator($validator) + { + if (is_array($validator)) { + if (! isset($validator['name'])) { + throw new Exception\RuntimeException( + 'Invalid validator specification provided; does not include "name" key' + ); + } + $name = $validator['name']; + $options = $validator['options'] ?? []; + /** @psalm-suppress MixedAssignment $validator */ + $validator = $this->getValidatorPluginManager()->get($name, $options); + } + + if (! $validator instanceof ValidatorInterface) { + throw new Exception\RuntimeException( + 'Invalid validator given' + ); + } + + $this->validator = $validator; + return $this; + } + + /** + * Gets the Validator for validating each value + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return ValidatorInterface|null + */ + public function getValidator() + { + return $this->validator; + } + + /** + * Set break on first failure setting + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param bool $break + * @return $this + */ + public function setBreakOnFirstFailure($break) + { + $this->breakOnFirstFailure = (bool) $break; + return $this; + } + + /** + * Get break on first failure setting + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return bool + */ + public function isBreakOnFirstFailure() + { + return $this->breakOnFirstFailure; + } + + /** + * Defined by Laminas\Validator\ValidatorInterface + * + * Returns true if all values validate true + * + * @param mixed $value + * @param mixed $context Extra "context" to provide the composed validator + * @return bool + * @throws Exception\RuntimeException + */ + public function isValid($value, $context = null) + { + $this->setValue($value); + + if ($value instanceof Traversable) { + $value = ArrayUtils::iteratorToArray($value); + } + + if (is_array($value)) { + $values = $value; + } elseif (is_string($value)) { + $delimiter = $this->getValueDelimiter(); + // Skip explode if delimiter is null, + // used when value is expected to be either an + // array when multiple values and a string for + // single values (ie. MultiCheckbox form behavior) + $values = null !== $delimiter + ? explode($this->valueDelimiter, $value) + : [$value]; + } else { + $values = [$value]; + } + + $validator = $this->getValidator(); + + if (! $validator) { + throw new Exception\RuntimeException(sprintf( + '%s expects a validator to be set; none given', + __METHOD__ + )); + } + + foreach ($values as $value) { + if (! $validator->isValid($value, $context)) { + $this->abstractOptions['messages'][] = $validator->getMessages(); + + if ($this->isBreakOnFirstFailure()) { + return false; + } + } + } + + return $this->abstractOptions['messages'] === []; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Count.php b/vendor/laminas/laminas-validator/src/File/Count.php new file mode 100644 index 00000000..99311efb --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Count.php @@ -0,0 +1,294 @@ + "Too many files, maximum '%max%' are allowed but '%count%' are given", + self::TOO_FEW => "Too few files, minimum '%min%' are expected but '%count%' are given", + ]; + + /** @var array Error message template variables */ + protected $messageVariables = [ + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + 'count' => 'count', + ]; + + /** + * Actual filecount + * + * @var int + */ + protected $count; + + /** + * Internal file array + * + * @var array + */ + protected $files; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'min' => null, // Minimum file count, if null there is no minimum file count + 'max' => null, // Maximum file count, if null there is no maximum file count + ]; + + /** + * Sets validator options + * + * Min limits the file count, when used with max=null it is the maximum file count + * It also accepts an array with the keys 'min' and 'max' + * + * If $options is an integer, it will be used as maximum file count + * As Array is accepts the following keys: + * 'min': Minimum filecount + * 'max': Maximum filecount + * + * @param int|array|Traversable $options Options for the adapter + */ + public function __construct($options = null) + { + if (1 < func_num_args()) { + $args = func_get_args(); + $options = [ + 'min' => array_shift($args), + 'max' => array_shift($args), + ]; + } + + if (is_string($options) || is_numeric($options)) { + $options = ['max' => $options]; + } + + parent::__construct($options); + } + + /** + * Returns the minimum file count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the minimum file count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int|array $min The minimum file count + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When min is greater than max. + */ + public function setMin($min) + { + if (is_array($min) && isset($min['min'])) { + $min = $min['min']; + } + + if (! is_numeric($min)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $min = (int) $min; + if (($this->getMax() !== null) && ($min > $this->getMax())) { + throw new Exception\InvalidArgumentException( + "The minimum must be less than or equal to the maximum file count, but {$min} > {$this->getMax()}" + ); + } + + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the maximum file count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the maximum file count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int|array $max The maximum file count + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When max is smaller than min. + */ + public function setMax($max) + { + if (is_array($max) && isset($max['max'])) { + $max = $max['max']; + } + + if (! is_numeric($max)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $max = (int) $max; + if (($this->getMin() !== null) && ($max < $this->getMin())) { + throw new Exception\InvalidArgumentException( + "The maximum must be greater than or equal to the minimum file count, but {$max} < {$this->getMin()}" + ); + } + + $this->options['max'] = $max; + return $this; + } + + /** + * Adds a file for validation + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array|UploadedFileInterface $file + * @return $this + */ + public function addFile($file) + { + if (is_string($file)) { + $file = [$file]; + } + + if (is_array($file)) { + foreach ($file as $name) { + if (! isset($this->files[$name]) && ! empty($name)) { + $this->files[$name] = $name; + } + } + } + + if ($file instanceof UploadedFileInterface && is_string($file->getClientFilename())) { + $this->files[(string) $file->getClientFilename()] = $file->getClientFilename(); + } + + return $this; + } + + /** + * Returns true if and only if the file count of all checked files is at least min and + * not bigger than max (when max is not null). Attention: When checking with set min you + * must give all files with the first call, otherwise you will get a false. + * + * @param string|array|UploadedFileInterface $value Filenames to check for count + * @param array $file File data from \Laminas\File\Transfer\Transfer + * @return bool + */ + public function isValid($value, $file = null) + { + if ($this->isUploadedFilterInterface($value)) { + $this->addFile($value); + } elseif ($file !== null) { + if (! array_key_exists('destination', $file)) { + $file['destination'] = dirname($value); + } + + if (array_key_exists('tmp_name', $file)) { + $value = $file['destination'] . DIRECTORY_SEPARATOR . $file['name']; + } + } + + if (($file === null) || ! empty($file['tmp_name'])) { + $this->addFile($value); + } + + $this->count = count($this->files); + + if (($this->getMax() !== null) && ($this->count > $this->getMax())) { + return $this->throwError($file, self::TOO_MANY); + } + + if (($this->getMin() !== null) && ($this->count < $this->getMin())) { + return $this->throwError($file, self::TOO_FEW); + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string|null|array $file + * @param string $errorType + * @return false + */ + protected function throwError($file, $errorType) + { + if ($file !== null) { + if (is_array($file)) { + if (array_key_exists('name', $file)) { + $this->value = $file['name']; + } + } elseif (is_string($file)) { + $this->value = $file; + } + } + + $this->error($errorType); + return false; + } + + /** + * Checks if the type of uploaded file is UploadedFileInterface. + * + * @param string|array|UploadedFileInterface $value Filenames to check for count + * @return bool + */ + private function isUploadedFilterInterface($value) + { + if ($value instanceof UploadedFileInterface) { + return true; + } + + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Crc32.php b/vendor/laminas/laminas-validator/src/File/Crc32.php new file mode 100644 index 00000000..303e4386 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Crc32.php @@ -0,0 +1,120 @@ + 'File does not match the given crc32 hashes', + self::NOT_DETECTED => 'A crc32 hash could not be evaluated for the given file', + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** + * Options for this validator + * + * @var string + */ + protected $options = [ + 'algorithm' => 'crc32', + 'hash' => null, + ]; + + /** + * Returns all set crc32 hashes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getCrc32() + { + return $this->getHash(); + } + + /** + * Sets the crc32 hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return $this Provides a fluent interface + */ + public function setCrc32($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the crc32 hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return $this Provides a fluent interface + */ + public function addCrc32($options) + { + $this->addHash($options); + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string|array $value Filename to check for hash + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_FOUND); + return false; + } + + $hashes = array_unique(array_keys($this->getHash())); + $filehash = hash_file('crc32', $fileInfo['file']); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/ExcludeExtension.php b/vendor/laminas/laminas-validator/src/File/ExcludeExtension.php new file mode 100644 index 00000000..684af768 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/ExcludeExtension.php @@ -0,0 +1,74 @@ + 'File has an incorrect extension', + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** + * Returns true if and only if the file extension of $value is not included in the + * set extension list + * + * @param string|array $value Real file to check for extension + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + // Is file readable ? + if ( + ! $this->getAllowNonExistentFile() + && (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) + ) { + $this->error(self::NOT_FOUND); + return false; + } + + $this->setValue($fileInfo['filename']); + + $extension = substr($fileInfo['filename'], strrpos($fileInfo['filename'], '.') + 1); + $extensions = $this->getExtension(); + + if ($this->getCase() && (! in_array($extension, $extensions))) { + return true; + } elseif (! $this->getCase()) { + foreach ($extensions as $ext) { + if (strtolower($ext) === strtolower($extension)) { + $this->error(self::FALSE_EXTENSION); + return false; + } + } + + return true; + } + + $this->error(self::FALSE_EXTENSION); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/ExcludeMimeType.php b/vendor/laminas/laminas-validator/src/File/ExcludeMimeType.php new file mode 100644 index 00000000..682b559d --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/ExcludeMimeType.php @@ -0,0 +1,102 @@ + "File has an incorrect mimetype of '%type%'", + self::NOT_DETECTED => 'The mimetype could not be detected from the file', + self::NOT_READABLE => 'File is not readable or does not exist', + ]; + + /** + * Returns true if the mimetype of the file does not matche the given ones. Also parts + * of mimetypes can be checked. If you give for example "image" all image + * mime types will not be accepted like "image/gif", "image/jpeg" and so on. + * + * @param string|array|UploadedFileInterface $value Real file to check for mimetype + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file, true); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_READABLE); + return false; + } + + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + if (! $this->isMagicFileDisabled() && (is_string($mimefile) && empty($this->finfo))) { + $this->finfo = finfo_open(FILEINFO_MIME_TYPE, $mimefile); + } + + if (empty($this->finfo)) { + $this->finfo = finfo_open(FILEINFO_MIME_TYPE); + } + + $this->type = null; + if (! empty($this->finfo)) { + $this->type = finfo_file($this->finfo, $fileInfo['file']); + } + } + + if (! is_string($this->type) && $this->getHeaderCheck()) { + $this->type = $fileInfo['filetype']; + } + + if (! is_string($this->type)) { + $this->error(self::NOT_DETECTED); + return false; + } + + $mimetype = $this->getMimeType(true); + if (in_array($this->type, $mimetype)) { + $this->error(self::FALSE_TYPE); + return false; + } + + $types = explode('/', $this->type); + $types = array_merge($types, explode('-', $this->type)); + $types = array_merge($types, explode(';', $this->type)); + foreach ($mimetype as $mime) { + if (in_array($mime, $types)) { + $this->error(self::FALSE_TYPE); + return false; + } + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Exists.php b/vendor/laminas/laminas-validator/src/File/Exists.php new file mode 100644 index 00000000..fc9bf858 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Exists.php @@ -0,0 +1,189 @@ + 'File does not exist', + ]; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'directory' => null, // internal list of directories + ]; + + /** @var array Error message template variables */ + protected $messageVariables = [ + 'directory' => ['options' => 'directory'], + ]; + + /** + * Sets validator options + * + * @param string|array|Traversable $options + */ + public function __construct($options = null) + { + if (is_string($options)) { + $options = explode(',', $options); + } + + if (is_array($options) && ! array_key_exists('directory', $options)) { + $options = ['directory' => $options]; + } + + parent::__construct($options); + } + + /** + * Returns the set file directories which are checked + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param bool $asArray Returns the values as array; when false, a concatenated string is returned + * @return string|null + */ + public function getDirectory($asArray = false) + { + $asArray = (bool) $asArray; + $directory = $this->options['directory']; + if ($asArray && isset($directory)) { + $directory = explode(',', (string) $directory); + } + + return $directory; + } + + /** + * Sets the file directory which will be checked + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $directory The directories to validate + * @return self Provides a fluent interface + */ + public function setDirectory($directory) + { + $this->options['directory'] = null; + $this->addDirectory($directory); + return $this; + } + + /** + * Adds the file directory which will be checked + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $directory The directory to add for validation + * @return self Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function addDirectory($directory) + { + $directories = $this->getDirectory(true); + if (! isset($directories)) { + $directories = []; + } + + if (is_string($directory)) { + $directory = explode(',', $directory); + } elseif (! is_array($directory)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + foreach ($directory as $content) { + if (empty($content) || ! is_string($content)) { + continue; + } + + $directories[] = trim($content); + } + $directories = array_unique($directories); + + // Sanity check to ensure no empty values + foreach ($directories as $key => $dir) { + if (empty($dir)) { + unset($directories[$key]); + } + } + + $this->options['directory'] = ! empty($directory) + ? implode(',', $directories) : null; + + return $this; + } + + /** + * Returns true if and only if the file already exists in the set directories + * + * @param string|array $value Real file to check for existence + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file, false, true); + + $this->setValue($fileInfo['filename']); + + $check = false; + $directories = $this->getDirectory(true); + if (! isset($directories)) { + $check = true; + if (! file_exists($fileInfo['file'])) { + $this->error(self::DOES_NOT_EXIST); + return false; + } + } else { + foreach ($directories as $directory) { + if (! isset($directory) || '' === $directory) { + continue; + } + + $check = true; + if (! file_exists($directory . DIRECTORY_SEPARATOR . $fileInfo['basename'])) { + $this->error(self::DOES_NOT_EXIST); + return false; + } + } + } + + if (! $check) { + $this->error(self::DOES_NOT_EXIST); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Extension.php b/vendor/laminas/laminas-validator/src/File/Extension.php new file mode 100644 index 00000000..3118eecb --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Extension.php @@ -0,0 +1,256 @@ + Error message templates */ + protected $messageTemplates = [ + self::FALSE_EXTENSION => 'File has an incorrect extension', + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'case' => false, // Validate case sensitive + 'extension' => '', // List of extensions + 'allowNonExistentFile' => false, // Allow validation even if file does not exist + ]; + + /** @var array Error message template variables */ + protected $messageVariables = [ + 'extension' => ['options' => 'extension'], + ]; + + /** + * Sets validator options + * + * @param string|array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + $case = null; + if (1 < func_num_args()) { + $case = func_get_arg(1); + } + + if (is_array($options)) { + if (isset($options['case'])) { + $case = $options['case']; + unset($options['case']); + } + + if (! array_key_exists('extension', $options)) { + $options = ['extension' => $options]; + } + } else { + $options = ['extension' => $options]; + } + + if ($case !== null) { + $options['case'] = $case; + } + + parent::__construct($options); + } + + /** + * Returns the case option + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getCase() + { + return $this->options['case']; + } + + /** + * Sets the case to use + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param bool $case + * @return $this Provides a fluent interface + */ + public function setCase($case) + { + $this->options['case'] = (bool) $case; + return $this; + } + + /** + * Returns the set file extension + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getExtension() + { + if ( + ! array_key_exists('extension', $this->options) + || ! is_string($this->options['extension']) + ) { + return []; + } + + return explode(',', $this->options['extension']); + } + + /** + * Sets the file extensions + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $extension The extensions to validate + * @return $this Provides a fluent interface + */ + public function setExtension($extension) + { + $this->options['extension'] = null; + $this->addExtension($extension); + return $this; + } + + /** + * Adds the file extensions + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $extension The extensions to add for validation + * @return $this Provides a fluent interface + */ + public function addExtension($extension) + { + $extensions = $this->getExtension(); + if (is_string($extension)) { + $extension = explode(',', $extension); + } + + foreach ($extension as $content) { + if (empty($content) || ! is_string($content)) { + continue; + } + + $extensions[] = trim($content); + } + + $extensions = array_unique($extensions); + + // Sanity check to ensure no empty values + foreach ($extensions as $key => $ext) { + if (empty($ext)) { + unset($extensions[$key]); + } + } + + $this->options['extension'] = implode(',', $extensions); + return $this; + } + + /** + * Returns whether or not to allow validation of non-existent files. + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getAllowNonExistentFile() + { + return $this->options['allowNonExistentFile']; + } + + /** + * Sets the flag indicating whether or not to allow validation of non-existent files. + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param bool $flag Whether or not to allow validation of non-existent files. + * @return $this Provides a fluent interface + */ + public function setAllowNonExistentFile($flag) + { + $this->options['allowNonExistentFile'] = (bool) $flag; + return $this; + } + + /** + * Returns true if and only if the file extension of $value is included in the + * set extension list + * + * @param string|array $value Real file to check for extension + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + // Is file readable ? + if ( + ! $this->getAllowNonExistentFile() + && (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) + ) { + $this->error(self::NOT_FOUND); + return false; + } + + $this->setValue($fileInfo['filename']); + + $extension = substr($fileInfo['filename'], strrpos($fileInfo['filename'], '.') + 1); + $extensions = $this->getExtension(); + + if ($this->getCase() && (in_array($extension, $extensions))) { + return true; + } elseif (! $this->getCase()) { + foreach ($extensions as $ext) { + if (strtolower($ext) === strtolower($extension)) { + return true; + } + } + } + + $this->error(self::FALSE_EXTENSION); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/FileInformationTrait.php b/vendor/laminas/laminas-validator/src/File/FileInformationTrait.php new file mode 100644 index 00000000..8c3092ab --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/FileInformationTrait.php @@ -0,0 +1,167 @@ +getLegacyFileInfo($file, $hasType, $hasBasename); + } + + if (is_array($value)) { + return $this->getSapiFileInfo($value, $hasType, $hasBasename); + } + + if ($value instanceof UploadedFileInterface) { + return $this->getPsr7FileInfo($value, $hasType, $hasBasename); + } + + return $this->getFileBasedFileInfo($value, $hasType, $hasBasename); + } + + /** + * Generate file information array with legacy Laminas_File_Transfer API + * + * @param array $file File data + * @param bool $hasType Return with filetype + * @param bool $hasBasename Basename is calculated from location path + * @return array + */ + private function getLegacyFileInfo( + array $file, + $hasType = false, + $hasBasename = false + ) { + $fileInfo = []; + + $fileInfo['filename'] = $file['name']; + $fileInfo['file'] = $file['tmp_name']; + + if ($hasBasename) { + $fileInfo['basename'] = basename($fileInfo['file']); + } + + if ($hasType) { + $fileInfo['filetype'] = $file['type']; + } + + return $fileInfo; + } + + /** + * Generate file information array with SAPI + * + * @param array $file File data from SAPI + * @param bool $hasType Return with filetype + * @param bool $hasBasename Filename is calculated from location path + * @return array + */ + private function getSapiFileInfo( + array $file, + $hasType = false, + $hasBasename = false + ) { + if (! isset($file['tmp_name']) || ! isset($file['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + + $fileInfo = []; + + $fileInfo['file'] = $file['tmp_name']; + $fileInfo['filename'] = $file['name']; + + if ($hasBasename) { + $fileInfo['basename'] = basename($fileInfo['file']); + } + + if ($hasType) { + $fileInfo['filetype'] = $file['type']; + } + + return $fileInfo; + } + + /** + * Generate file information array with PSR-7 UploadedFileInterface + * + * @param bool $hasType Return with filetype + * @param bool $hasBasename Filename is calculated from location path + * @return array + */ + private function getPsr7FileInfo( + UploadedFileInterface $file, + $hasType = false, + $hasBasename = false + ) { + $fileInfo = []; + + $fileInfo['file'] = $file->getStream()->getMetadata('uri'); + $fileInfo['filename'] = $file->getClientFilename(); + + if ($hasBasename) { + $fileInfo['basename'] = basename($fileInfo['file']); + } + + if ($hasType) { + $fileInfo['filetype'] = $file->getClientMediaType(); + } + + return $fileInfo; + } + + /** + * Generate file information array with base method + * + * @param string $file File path + * @param bool $hasType Return with filetype + * @param bool $hasBasename Filename is calculated from location path + * @return array + */ + private function getFileBasedFileInfo( + $file, + $hasType = false, + $hasBasename = false + ) { + $fileInfo = []; + + $fileInfo['file'] = $file; + $fileInfo['filename'] = basename($fileInfo['file']); + + if ($hasBasename) { + $fileInfo['basename'] = basename($fileInfo['file']); + } + + if ($hasType) { + $fileInfo['filetype'] = null; + } + + return $fileInfo; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/FilesSize.php b/vendor/laminas/laminas-validator/src/File/FilesSize.php new file mode 100644 index 00000000..029aa40a --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/FilesSize.php @@ -0,0 +1,186 @@ + "All files in sum should have a maximum size of '%max%' but '%size%' were detected", + self::TOO_SMALL => "All files in sum should have a minimum size of '%min%' but '%size%' were detected", + self::NOT_READABLE => 'One or more files can not be read', + ]; + + /** + * Internal file array + * + * @var array + */ + protected $files; + + /** + * Sets validator options + * + * Min limits the used disk space for all files, when used with max=null it is the maximum file size + * It also accepts an array with the keys 'min' and 'max' + * + * @param int|array|Traversable $options Options for this validator + * @throws InvalidArgumentException + */ + public function __construct($options = null) + { + $this->files = []; + $this->setSize(0); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (is_scalar($options)) { + $options = ['max' => $options]; + } elseif (! is_array($options)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + if (1 < func_num_args()) { + $argv = func_get_args(); + array_shift($argv); + $options['max'] = array_shift($argv); + if (! empty($argv)) { + $options['useByteString'] = array_shift($argv); + } + } + + parent::__construct($options); + } + + /** + * Returns true if and only if the disk usage of all files is at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value Real file to check for size + * @param array $file File data from \Laminas\File\Transfer\Transfer + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value)) { + $value = [$value]; + } elseif (is_array($value) && isset($value['tmp_name'])) { + $value = [$value]; + } + + $min = $this->getMin(true); + $max = $this->getMax(true); + $size = $this->getSize(); + foreach ($value as $files) { + if (is_array($files)) { + if (! isset($files['tmp_name']) || ! isset($files['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $files; + $files = $files['tmp_name']; + } + + // Is file readable ? + if (empty($files) || false === is_readable($files)) { + $this->throwError($file, self::NOT_READABLE); + continue; + } + + if (! isset($this->files[$files])) { + $this->files[$files] = $files; + } else { + // file already counted... do not count twice + continue; + } + + // limited to 2GB files + ErrorHandler::start(); + $size += filesize($files); + ErrorHandler::stop(); + $this->size = $size; + if (($max !== null) && ($max < $size)) { + if ($this->getByteString()) { + $this->options['max'] = $this->toByteString($max); + $this->size = $this->toByteString($size); + $this->throwError($file, self::TOO_BIG); + $this->options['max'] = $max; + $this->size = $size; + } else { + $this->throwError($file, self::TOO_BIG); + } + } + } + + // Check that aggregate files are >= minimum size + if (($min !== null) && ($size < $min)) { + if ($this->getByteString()) { + $this->options['min'] = $this->toByteString($min); + $this->size = $this->toByteString($size); + $this->throwError($file, self::TOO_SMALL); + $this->options['min'] = $min; + $this->size = $size; + } else { + $this->throwError($file, self::TOO_SMALL); + } + } + + if ($this->getMessages()) { + return false; + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string|null|array $file + * @param string $errorType + * @return false + */ + protected function throwError($file, $errorType) + { + if ($file !== null) { + if (is_array($file)) { + if (array_key_exists('name', $file)) { + $this->value = $file['name']; + } + } elseif (is_string($file)) { + $this->value = $file; + } + } + + $this->error($errorType); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Hash.php b/vendor/laminas/laminas-validator/src/File/Hash.php new file mode 100644 index 00000000..e9d1d0a2 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Hash.php @@ -0,0 +1,181 @@ + 'File does not match the given hashes', + self::NOT_DETECTED => 'A hash could not be evaluated for the given file', + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** + * Options for this validator + * + * @var string + */ + protected $options = [ + 'algorithm' => 'crc32', + 'hash' => null, + ]; + + /** + * Sets validator options + * + * @param string|array $options + */ + public function __construct($options = null) + { + if ( + is_scalar($options) || + (is_array($options) && ! array_key_exists('hash', $options)) + ) { + $options = ['hash' => $options]; + } + + if (1 < func_num_args()) { + $options['algorithm'] = func_get_arg(1); + } + + parent::__construct($options); + } + + /** + * Returns the set hash values as array, the hash as key and the algorithm the value + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getHash() + { + return $this->options['hash']; + } + + /** + * Sets the hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return $this Provides a fluent interface + */ + public function setHash($options) + { + $this->options['hash'] = null; + $this->addHash($options); + + return $this; + } + + /** + * Adds the hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function addHash($options) + { + if (is_string($options)) { + $options = [$options]; + } elseif (! is_array($options)) { + throw new Exception\InvalidArgumentException('False parameter given'); + } + + $known = hash_algos(); + if (! isset($options['algorithm'])) { + $algorithm = $this->options['algorithm']; + } else { + $algorithm = $options['algorithm']; + unset($options['algorithm']); + } + + if (! in_array($algorithm, $known)) { + throw new Exception\InvalidArgumentException("Unknown algorithm '{$algorithm}'"); + } + + foreach ($options as $value) { + if (! is_string($value)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Hash must be a string, %s received', + get_debug_type($value) + )); + } + $this->options['hash'][$value] = $algorithm; + } + + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string|array $value File to check for hash + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_FOUND); + return false; + } + + $algos = array_unique(array_values($this->getHash())); + foreach ($algos as $algorithm) { + $filehash = hash_file($algorithm, $fileInfo['file']); + + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + if (isset($this->getHash()[$filehash]) && $this->getHash()[$filehash] === $algorithm) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/ImageSize.php b/vendor/laminas/laminas-validator/src/File/ImageSize.php new file mode 100644 index 00000000..216814b3 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/ImageSize.php @@ -0,0 +1,407 @@ + "Maximum allowed width for image should be '%maxwidth%' but '%width%' detected", + self::WIDTH_TOO_SMALL => "Minimum expected width for image should be '%minwidth%' but '%width%' detected", + self::HEIGHT_TOO_BIG => "Maximum allowed height for image should be '%maxheight%' but '%height%' detected", + self::HEIGHT_TOO_SMALL => "Minimum expected height for image should be '%minheight%' but '%height%' detected", + self::NOT_DETECTED => 'The size of image could not be detected', + self::NOT_READABLE => 'File is not readable or does not exist', + ]; + + /** @var array Error message template variables */ + protected $messageVariables = [ + 'minwidth' => ['options' => 'minWidth'], + 'maxwidth' => ['options' => 'maxWidth'], + 'minheight' => ['options' => 'minHeight'], + 'maxheight' => ['options' => 'maxHeight'], + 'width' => 'width', + 'height' => 'height', + ]; + + /** + * Detected width + * + * @var int + */ + protected $width; + + /** + * Detected height + * + * @var int + */ + protected $height; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'minWidth' => null, // Minimum image width + 'maxWidth' => null, // Maximum image width + 'minHeight' => null, // Minimum image height + 'maxHeight' => null, // Maximum image height + ]; + + /** + * Sets validator options + * + * Accepts the following option keys: + * - minheight + * - minwidth + * - maxheight + * - maxwidth + * + * @param null|array|Traversable $options + */ + public function __construct($options = null) + { + if (1 < func_num_args()) { + if (! is_array($options)) { + $options = ['minWidth' => $options]; + } + + $argv = func_get_args(); + array_shift($argv); + $options['minHeight'] = array_shift($argv); + if (! empty($argv)) { + $options['maxWidth'] = array_shift($argv); + if (! empty($argv)) { + $options['maxHeight'] = array_shift($argv); + } + } + } + + parent::__construct($options); + } + + /** + * Returns the minimum allowed width + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMinWidth() + { + return $this->options['minWidth']; + } + + /** + * Sets the minimum allowed width + * + * @param int $minWidth + * @return $this Provides a fluid interface + * @throws Exception\InvalidArgumentException When minwidth is greater than maxwidth. + */ + public function setMinWidth($minWidth) + { + if (($this->getMaxWidth() !== null) && ($minWidth > $this->getMaxWidth())) { + throw new Exception\InvalidArgumentException( + 'The minimum image width must be less than or equal to the ' + . " maximum image width, but {$minWidth} > {$this->getMaxWidth()}" + ); + } + + $this->options['minWidth'] = (int) $minWidth; + return $this; + } + + /** + * Returns the maximum allowed width + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMaxWidth() + { + return $this->options['maxWidth']; + } + + /** + * Sets the maximum allowed width + * + * @param int $maxWidth + * @return $this Provides a fluid interface + * @throws Exception\InvalidArgumentException When maxwidth is less than minwidth. + */ + public function setMaxWidth($maxWidth) + { + if (($this->getMinWidth() !== null) && ($maxWidth < $this->getMinWidth())) { + throw new Exception\InvalidArgumentException( + 'The maximum image width must be greater than or equal to the ' + . "minimum image width, but {$maxWidth} < {$this->getMinWidth()}" + ); + } + + $this->options['maxWidth'] = (int) $maxWidth; + return $this; + } + + /** + * Returns the minimum allowed height + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMinHeight() + { + return $this->options['minHeight']; + } + + /** + * Sets the minimum allowed height + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int $minHeight + * @return $this Provides a fluid interface + * @throws Exception\InvalidArgumentException When minheight is greater than maxheight. + */ + public function setMinHeight($minHeight) + { + if (($this->getMaxHeight() !== null) && ($minHeight > $this->getMaxHeight())) { + throw new Exception\InvalidArgumentException( + 'The minimum image height must be less than or equal to the ' + . " maximum image height, but {$minHeight} > {$this->getMaxHeight()}" + ); + } + + $this->options['minHeight'] = (int) $minHeight; + return $this; + } + + /** + * Returns the maximum allowed height + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMaxHeight() + { + return $this->options['maxHeight']; + } + + /** + * Sets the maximum allowed height + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int $maxHeight + * @return $this Provides a fluid interface + * @throws Exception\InvalidArgumentException When maxheight is less than minheight. + */ + public function setMaxHeight($maxHeight) + { + if (($this->getMinHeight() !== null) && ($maxHeight < $this->getMinHeight())) { + throw new Exception\InvalidArgumentException( + 'The maximum image height must be greater than or equal to the ' + . "minimum image height, but {$maxHeight} < {$this->getMinHeight()}" + ); + } + + $this->options['maxHeight'] = (int) $maxHeight; + return $this; + } + + /** + * Returns the set minimum image sizes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getImageMin() + { + return ['minWidth' => $this->getMinWidth(), 'minHeight' => $this->getMinHeight()]; + } + + /** + * Returns the set maximum image sizes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getImageMax() + { + return ['maxWidth' => $this->getMaxWidth(), 'maxHeight' => $this->getMaxHeight()]; + } + + /** + * Returns the set image width sizes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getImageWidth() + { + return ['minWidth' => $this->getMinWidth(), 'maxWidth' => $this->getMaxWidth()]; + } + + /** + * Returns the set image height sizes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getImageHeight() + { + return ['minHeight' => $this->getMinHeight(), 'maxHeight' => $this->getMaxHeight()]; + } + + /** + * Sets the minimum image size + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param array $options The minimum image dimensions + * @return $this Provides a fluent interface + */ + public function setImageMin($options) + { + $this->setOptions($options); + return $this; + } + + /** + * Sets the maximum image size + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param array|Traversable $options The maximum image dimensions + * @return $this Provides a fluent interface + */ + public function setImageMax($options) + { + $this->setOptions($options); + return $this; + } + + /** + * Sets the minimum and maximum image width + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param array $options The image width dimensions + * @return $this Provides a fluent interface + */ + public function setImageWidth($options) + { + $this->setImageMin($options); + $this->setImageMax($options); + + return $this; + } + + /** + * Sets the minimum and maximum image height + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param array $options The image height dimensions + * @return $this Provides a fluent interface + */ + public function setImageHeight($options) + { + $this->setImageMin($options); + $this->setImageMax($options); + + return $this; + } + + /** + * Returns true if and only if the image size of $value is at least min and + * not bigger than max + * + * @param string|array $value Real file to check for image size + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_READABLE); + return false; + } + + ErrorHandler::start(); + $size = getimagesize($fileInfo['file']); + ErrorHandler::stop(); + + if (empty($size) || ($size[0] === 0) || ($size[1] === 0)) { + $this->error(self::NOT_DETECTED); + return false; + } + + $this->width = $size[0]; + $this->height = $size[1]; + if ($this->width < $this->getMinWidth()) { + $this->error(self::WIDTH_TOO_SMALL); + } + + if (($this->getMaxWidth() !== null) && ($this->getMaxWidth() < $this->width)) { + $this->error(self::WIDTH_TOO_BIG); + } + + if ($this->height < $this->getMinHeight()) { + $this->error(self::HEIGHT_TOO_SMALL); + } + + if (($this->getMaxHeight() !== null) && ($this->getMaxHeight() < $this->height)) { + $this->error(self::HEIGHT_TOO_BIG); + } + + if ($this->getMessages()) { + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/IsCompressed.php b/vendor/laminas/laminas-validator/src/File/IsCompressed.php new file mode 100644 index 00000000..1a807a6e --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/IsCompressed.php @@ -0,0 +1,86 @@ + "File is not compressed, '%type%' detected", + self::NOT_DETECTED => 'The mimetype could not be detected from the file', + self::NOT_READABLE => 'File is not readable or does not exist', + ]; + + /** + * Sets validator options + * + * @param string|array|Traversable $options + */ + public function __construct($options = []) + { + // http://hul.harvard.edu/ois/systems/wax/wax-public-help/mimetypes.htm + $default = [ + 'application/arj', + 'application/gnutar', + 'application/lha', + 'application/lzx', + 'application/vnd.ms-cab-compressed', + 'application/x-ace-compressed', + 'application/x-arc', + 'application/x-archive', + 'application/x-arj', + 'application/x-bzip', + 'application/x-bzip2', + 'application/x-cab-compressed', + 'application/x-compress', + 'application/x-compressed', + 'application/x-cpio', + 'application/x-debian-package', + 'application/x-eet', + 'application/x-gzip', + 'application/x-java-pack200', + 'application/x-lha', + 'application/x-lharc', + 'application/x-lzh', + 'application/x-lzma', + 'application/x-lzx', + 'application/x-rar', + 'application/x-sit', + 'application/x-stuffit', + 'application/x-tar', + 'application/zip', + 'application/x-zip', + 'application/zoo', + 'multipart/x-gzip', + ]; + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if ($options === null) { + $options = []; + } + + parent::__construct($options); + + if (! $this->getMimeType()) { + $this->setMimeType($default); + } + } +} diff --git a/vendor/laminas/laminas-validator/src/File/IsImage.php b/vendor/laminas/laminas-validator/src/File/IsImage.php new file mode 100644 index 00000000..e8b2079d --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/IsImage.php @@ -0,0 +1,112 @@ + "File is no image, '%type%' detected", + self::NOT_DETECTED => 'The mimetype could not be detected from the file', + self::NOT_READABLE => 'File is not readable or does not exist', + ]; + + /** + * Sets validator options + * + * @param array|Traversable|string $options + */ + public function __construct($options = []) + { + // http://www.iana.org/assignments/media-types/media-types.xhtml#image + $default = [ + 'application/cdf', + 'application/dicom', + 'application/fractals', + 'application/postscript', + 'application/vnd.hp-hpgl', + 'application/vnd.oasis.opendocument.graphics', + 'application/x-cdf', + 'application/x-cmu-raster', + 'application/x-ima', + 'application/x-inventor', + 'application/x-koan', + 'application/x-portable-anymap', + 'application/x-world-x-3dmf', + 'image/bmp', + 'image/c', + 'image/cgm', + 'image/fif', + 'image/gif', + 'image/heic', + 'image/heif', + 'image/jpeg', + 'image/jpm', + 'image/jpx', + 'image/jp2', + 'image/naplps', + 'image/pjpeg', + 'image/png', + 'image/svg', + 'image/svg+xml', + 'image/tiff', + 'image/vnd.adobe.photoshop', + 'image/vnd.djvu', + 'image/vnd.fpx', + 'image/vnd.net-fpx', + 'image/webp', + 'image/x-cmu-raster', + 'image/x-cmx', + 'image/x-coreldraw', + 'image/x-cpi', + 'image/x-emf', + 'image/x-ico', + 'image/x-icon', + 'image/x-jg', + 'image/x-ms-bmp', + 'image/x-niff', + 'image/x-pict', + 'image/x-pcx', + 'image/x-png', + 'image/x-portable-anymap', + 'image/x-portable-bitmap', + 'image/x-portable-greymap', + 'image/x-portable-pixmap', + 'image/x-quicktime', + 'image/x-rgb', + 'image/x-tiff', + 'image/x-unknown', + 'image/x-windows-bmp', + 'image/x-xpmi', + ]; + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if ($options === null) { + $options = []; + } + + parent::__construct($options); + + if (! $this->getMimeType()) { + $this->setMimeType($default); + } + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Md5.php b/vendor/laminas/laminas-validator/src/File/Md5.php new file mode 100644 index 00000000..6adc250f --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Md5.php @@ -0,0 +1,120 @@ + 'File does not match the given md5 hashes', + self::NOT_DETECTED => 'An md5 hash could not be evaluated for the given file', + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** + * Options for this validator + * + * @var string + */ + protected $options = [ + 'algorithm' => 'md5', + 'hash' => null, + ]; + + /** + * Returns all set md5 hashes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getMd5() + { + return $this->getHash(); + } + + /** + * Sets the md5 hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function setMd5($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the md5 hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function addMd5($options) + { + $this->addHash($options); + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string|array $value Filename to check for hash + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_FOUND); + return false; + } + + $hashes = array_unique(array_keys($this->getHash())); + $filehash = hash_file('md5', $fileInfo['file']); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/MimeType.php b/vendor/laminas/laminas-validator/src/File/MimeType.php new file mode 100644 index 00000000..b106ffc2 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/MimeType.php @@ -0,0 +1,431 @@ + */ + protected $messageTemplates = [ + self::FALSE_TYPE => "File has an incorrect mimetype of '%type%'", + self::NOT_DETECTED => 'The mimetype could not be detected from the file', + self::NOT_READABLE => 'File is not readable or does not exist', + ]; + + /** @var array */ + protected $messageVariables = [ + 'type' => 'type', + ]; + + /** @var string */ + protected $type; + + /** + * Finfo object to use + * + * @var finfo|null + */ + protected $finfo; + + /** + * If no environment variable 'MAGIC' is set, try and autodiscover it based on common locations + * + * @var list + */ + protected $magicFiles = [ + '/usr/share/misc/magic', + '/usr/share/misc/magic.mime', + '/usr/share/misc/magic.mgc', + '/usr/share/mime/magic', + '/usr/share/mime/magic.mime', + '/usr/share/mime/magic.mgc', + '/usr/share/file/magic', + '/usr/share/file/magic.mime', + '/usr/share/file/magic.mgc', + ]; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'enableHeaderCheck' => false, // Allow header check + 'disableMagicFile' => false, // Disable usage of magicfile + 'magicFile' => null, // Magicfile to use + 'mimeType' => null, // Mimetype to allow + ]; + + /** + * Sets validator options + * + * Mimetype to accept + * - NULL means default PHP usage by using the environment variable 'magic' + * - FALSE means disabling searching for mimetype, should be used for PHP 5.3 + * - A string is the mimetype file to use + * + * @param string|array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (is_string($options)) { + $this->setMimeType($options); + $options = []; + } elseif (is_array($options)) { + if (isset($options['magicFile'])) { + $this->setMagicFile($options['magicFile']); + unset($options['magicFile']); + } + + if (isset($options['enableHeaderCheck'])) { + $this->enableHeaderCheck((bool) $options['enableHeaderCheck']); + unset($options['enableHeaderCheck']); + } + + if (array_key_exists('mimeType', $options)) { + $this->setMimeType($options['mimeType']); + unset($options['mimeType']); + } + + // Handle cases where mimetypes are interspersed with options, or + // options are simply an array of mime types + foreach (array_keys($options) as $key) { + if (! is_int($key)) { + continue; + } + $this->addMimeType($options[$key]); + unset($options[$key]); + } + } + + parent::__construct($options); + } + + /** + * Returns the actual set magicfile + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return string|false + */ + public function getMagicFile() + { + if (null === $this->options['magicFile']) { + $magic = getenv('magic'); + if (is_string($magic) && $magic !== '') { + $this->setMagicFile($magic); + if ($this->options['magicFile'] === null) { + $this->options['magicFile'] = false; + } + return $this->options['magicFile']; + } + + foreach ($this->magicFiles as $file) { + try { + $this->setMagicFile($file); + } catch (Exception\ExceptionInterface) { + // suppressing errors which are thrown due to open_basedir restrictions + continue; + } + + if (is_string($this->options['magicFile'])) { + return $this->options['magicFile']; + } + } + + if ($this->options['magicFile'] === null) { + $this->options['magicFile'] = false; + } + } + + return $this->options['magicFile']; + } + + /** + * Sets the magicfile to use + * if null, the MAGIC constant from php is used + * if the MAGIC file is erroneous, no file will be set + * if false, the default MAGIC file from PHP will be used + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param string $file + * @return self Provides fluid interface + * @throws Exception\InvalidArgumentException + * @throws Exception\InvalidMagicMimeFileException + * @throws Exception\RuntimeException When finfo can not read the magicfile. + */ + public function setMagicFile($file) + { + if ($file === false) { + $this->options['magicFile'] = false; + } elseif (empty($file)) { + $this->options['magicFile'] = null; + } elseif (! class_exists('finfo', false)) { + $this->options['magicFile'] = null; + throw new Exception\RuntimeException('Magicfile can not be set; there is no finfo extension installed'); + } elseif (! is_file($file) || ! is_readable($file)) { + throw new Exception\InvalidArgumentException(sprintf( + 'The given magicfile ("%s") could not be read', + $file + )); + } else { + ErrorHandler::start(E_NOTICE | E_WARNING); + $this->finfo = finfo_open(FILEINFO_MIME_TYPE, $file); + $error = ErrorHandler::stop(); + if (empty($this->finfo)) { + $this->finfo = null; + throw new Exception\InvalidMagicMimeFileException(sprintf( + 'The given magicfile ("%s") could not be used by ext/finfo', + $file + ), 0, $error); + } + $this->options['magicFile'] = $file; + } + + return $this; + } + + /** + * Disables usage of MagicFile + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param bool $disable False disables usage of magic file; true enables it. + * @return self Provides fluid interface + */ + public function disableMagicFile($disable) + { + $this->options['disableMagicFile'] = (bool) $disable; + return $this; + } + + /** + * Is usage of MagicFile disabled? + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return bool + */ + public function isMagicFileDisabled() + { + return $this->options['disableMagicFile']; + } + + /** + * Returns the Header Check option + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getHeaderCheck() + { + return $this->options['enableHeaderCheck']; + } + + /** + * Defines if the http header should be used + * Note that this is unsafe and therefor the default value is false + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param bool $headerCheck + * @return self Provides fluid interface + */ + public function enableHeaderCheck($headerCheck = true) + { + $this->options['enableHeaderCheck'] = (bool) $headerCheck; + return $this; + } + + /** + * Returns the set mimetypes + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param bool $asArray Returns the values as array, when false a concatenated string is returned + * @return string|list + * @psalm-return ($asArray is true ? list : string) + */ + public function getMimeType($asArray = false) + { + $asArray = (bool) $asArray; + $mimetype = (string) $this->options['mimeType']; + if ($asArray) { + $mimetype = explode(',', $mimetype); + } + + return $mimetype; + } + + /** + * Sets the mimetypes + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param string|list $mimetype The mimetypes to validate + * @return self Provides a fluent interface + */ + public function setMimeType($mimetype) + { + $this->options['mimeType'] = null; + $this->addMimeType($mimetype); + return $this; + } + + /** + * Adds the mimetypes + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param string|list $mimetype The mimetypes to add for validation + * @throws Exception\InvalidArgumentException + * @return self Provides a fluent interface + */ + public function addMimeType($mimetype) + { + $mimetypes = $this->getMimeType(true); + + if (is_string($mimetype)) { + $mimetype = explode(',', $mimetype); + } elseif (! is_array($mimetype)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + if (isset($mimetype['magicFile'])) { + unset($mimetype['magicFile']); + } + + foreach ($mimetype as $content) { + if (! is_string($content) || $content === '') { + continue; + } + + $mimetypes[] = trim($content); + } + $mimetypes = array_unique(array_filter($mimetypes)); + + $this->options['mimeType'] = implode(',', $mimetypes); + + return $this; + } + + /** + * Defined by Laminas\Validator\ValidatorInterface + * + * Returns true if the mimetype of the file matches the given ones. Also parts + * of mimetypes can be checked. If you give for example "image" all image + * mime types will be accepted like "image/gif", "image/jpeg" and so on. + * + * @param string|array|UploadedFileInterface $value Real file to check for mimetype + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file, true); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(static::NOT_READABLE); + return false; + } + + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + if (! $this->isMagicFileDisabled() && (is_string($mimefile) && empty($this->finfo))) { + ErrorHandler::start(E_NOTICE | E_WARNING); + $this->finfo = finfo_open(FILEINFO_MIME_TYPE, $mimefile); + ErrorHandler::stop(); + } + + if (empty($this->finfo)) { + ErrorHandler::start(E_NOTICE | E_WARNING); + $this->finfo = finfo_open(FILEINFO_MIME_TYPE); + ErrorHandler::stop(); + } + + $this->type = null; + if (! empty($this->finfo)) { + $this->type = finfo_file($this->finfo, $fileInfo['file']); + unset($this->finfo); + } + } + + if ($this->type === null && $this->getHeaderCheck()) { + $this->type = $fileInfo['filetype']; + } + + if ($this->type === null) { + $this->error(static::NOT_DETECTED); + return false; + } + + $mimetype = $this->getMimeType(true); + if (in_array($this->type, $mimetype)) { + return true; + } + + $types = explode('/', $this->type); + $types = array_merge($types, explode('-', $this->type)); + $types = array_merge($types, explode(';', $this->type)); + foreach ($mimetype as $mime) { + if (in_array($mime, $types)) { + return true; + } + } + + $this->error(static::FALSE_TYPE); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/NotExists.php b/vendor/laminas/laminas-validator/src/File/NotExists.php new file mode 100644 index 00000000..6e19d964 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/NotExists.php @@ -0,0 +1,70 @@ + 'File exists', + ]; + + /** + * Returns true if and only if the file does not exist in the set destinations + * + * @param string|array $value Real file to check for existence + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file, false, true); + + $this->setValue($fileInfo['filename']); + + $check = false; + $directories = $this->getDirectory(true); + if (! isset($directories)) { + $check = true; + if (file_exists($fileInfo['file'])) { + $this->error(self::DOES_EXIST); + return false; + } + } else { + foreach ($directories as $directory) { + if (! isset($directory) || '' === $directory) { + continue; + } + + $check = true; + if (file_exists($directory . DIRECTORY_SEPARATOR . $fileInfo['basename'])) { + $this->error(self::DOES_EXIST); + return false; + } + } + } + + if (! $check) { + $this->error(self::DOES_EXIST); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Sha1.php b/vendor/laminas/laminas-validator/src/File/Sha1.php new file mode 100644 index 00000000..23a68c20 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Sha1.php @@ -0,0 +1,120 @@ + 'File does not match the given sha1 hashes', + self::NOT_DETECTED => 'A sha1 hash could not be evaluated for the given file', + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** + * Options for this validator + * + * @var string + */ + protected $options = [ + 'algorithm' => 'sha1', + 'hash' => null, + ]; + + /** + * Returns all set sha1 hashes + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return array + */ + public function getSha1() + { + return $this->getHash(); + } + + /** + * Sets the sha1 hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function setSha1($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the sha1 hash for one or multiple files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function addSha1($options) + { + $this->addHash($options); + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param (int|string)[]|string $value Filename to check for hash + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_FOUND); + return false; + } + + $hashes = array_unique(array_keys($this->getHash())); + $filehash = hash_file('sha1', $fileInfo['file']); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Size.php b/vendor/laminas/laminas-validator/src/File/Size.php new file mode 100644 index 00000000..1972f446 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Size.php @@ -0,0 +1,375 @@ + "Maximum allowed size for file is '%max%' but '%size%' detected", + self::TOO_SMALL => "Minimum expected size for file is '%min%' but '%size%' detected", + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** @var array Error message template variables */ + protected $messageVariables = [ + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + 'size' => 'size', + ]; + + /** + * Detected size + * + * @var int + */ + protected $size; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'min' => null, // Minimum file size, if null there is no minimum + 'max' => null, // Maximum file size, if null there is no maximum + 'useByteString' => true, // Use byte string? + ]; + + /** + * Sets validator options + * + * If $options is an integer, it will be used as maximum file size + * As Array is accepts the following keys: + * 'min': Minimum file size + * 'max': Maximum file size + * 'useByteString': Use bytestring or real size for messages + * + * @param int|array|Traversable $options Options for the adapter + */ + public function __construct($options = null) + { + if (is_string($options) || is_numeric($options)) { + $options = ['max' => $options]; + } + + if (1 < func_num_args()) { + $argv = func_get_args(); + array_shift($argv); + $options['max'] = array_shift($argv); + if (! empty($argv)) { + $options['useByteString'] = array_shift($argv); + } + } + + parent::__construct($options); + } + + /** + * Should messages return bytes as integer or as string in SI notation + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param bool $byteString Use bytestring ? + * @return self + */ + public function useByteString($byteString = true) + { + $this->options['useByteString'] = (bool) $byteString; + return $this; + } + + /** + * Will bytestring be used? + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getByteString() + { + return $this->options['useByteString']; + } + + /** + * Returns the minimum file size + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param bool $raw Whether or not to force return of the raw value (defaults off) + * @return int|string + */ + public function getMin($raw = false) + { + $min = $this->options['min']; + if (! $raw && $this->getByteString()) { + $min = $this->toByteString($min); + } + + return $min; + } + + /** + * Sets the minimum file size + * + * File size can be an integer or a byte string + * This includes 'B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' + * For example: 2000, 2MB, 0.2GB + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int|string $min The minimum file size + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When min is greater than max. + */ + public function setMin($min) + { + if (! is_string($min) && ! is_numeric($min)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $min = (int) $this->fromByteString($min); + $max = $this->getMax(true); + if (($max !== null) && ($min > $max)) { + throw new Exception\InvalidArgumentException( + "The minimum must be less than or equal to the maximum file size, but $min > $max" + ); + } + + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the maximum file size + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param bool $raw Whether or not to force return of the raw value (defaults off) + * @return int|string + */ + public function getMax($raw = false) + { + $max = $this->options['max']; + if (! $raw && $this->getByteString()) { + $max = $this->toByteString($max); + } + + return $max; + } + + /** + * Sets the maximum file size + * + * File size can be an integer or a byte string + * This includes 'B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' + * For example: 2000, 2MB, 0.2GB + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int|string $max The maximum file size + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When max is smaller than min. + */ + public function setMax($max) + { + if (! is_string($max) && ! is_numeric($max)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $max = (int) $this->fromByteString($max); + $min = $this->getMin(true); + if (($min !== null) && ($max < $min)) { + throw new Exception\InvalidArgumentException( + "The maximum must be greater than or equal to the minimum file size, but $max < $min" + ); + } + + $this->options['max'] = $max; + return $this; + } + + /** + * Retrieve current detected file size + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + protected function getSize() + { + return $this->size; + } + + /** + * Set current size + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int $size + * @return $this + */ + protected function setSize($size) + { + $this->size = $size; + return $this; + } + + /** + * Returns true if and only if the file size of $value is at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value File to check for size + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_FOUND); + return false; + } + + // limited to 4GB files + ErrorHandler::start(); + $size = sprintf('%u', filesize($fileInfo['file'])); + ErrorHandler::stop(); + $this->size = $size; + + // Check to see if it's smaller than min size + $min = $this->getMin(true); + $max = $this->getMax(true); + if (($min !== null) && ($size < $min)) { + if ($this->getByteString()) { + $this->options['min'] = $this->toByteString($min); + $this->size = $this->toByteString($size); + $this->error(self::TOO_SMALL); + $this->options['min'] = $min; + $this->size = $size; + } else { + $this->error(self::TOO_SMALL); + } + } + + // Check to see if it's larger than max size + if (($max !== null) && ($max < $size)) { + if ($this->getByteString()) { + $this->options['max'] = $this->toByteString($max); + $this->size = $this->toByteString($size); + $this->error(self::TOO_BIG); + $this->options['max'] = $max; + $this->size = $size; + } else { + $this->error(self::TOO_BIG); + } + } + + if ($this->getMessages()) { + return false; + } + + return true; + } + + /** + * Returns the formatted size + * + * @param int $size + * @return string + */ + protected function toByteString($size) + { + $sizes = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + for ($i = 0; $size >= 1024 && $i < 9; $i++) { + $size /= 1024; + } + + return round($size, 2) . $sizes[$i]; + } + + /** + * Returns the unformatted size + * + * @param string $size + * @return float|int|string + */ + protected function fromByteString($size) + { + if (is_numeric($size)) { + return (int) $size; + } + + $type = trim(substr($size, -2, 1)); + + $value = substr($size, 0, -1); + if (! is_numeric($value)) { + $value = trim(substr($value, 0, -1)); + } + + switch (strtoupper($type)) { + case 'Y': + $value *= 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024; + break; + case 'Z': + $value *= 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024; + break; + case 'E': + $value *= 1024 * 1024 * 1024 * 1024 * 1024 * 1024; + break; + case 'P': + $value *= 1024 * 1024 * 1024 * 1024 * 1024; + break; + case 'T': + $value *= 1024 * 1024 * 1024 * 1024; + break; + case 'G': + $value *= 1024 * 1024 * 1024; + break; + case 'M': + $value *= 1024 * 1024; + break; + case 'K': + $value *= 1024; + break; + default: + break; + } + + return $value; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/Upload.php b/vendor/laminas/laminas-validator/src/File/Upload.php new file mode 100644 index 00000000..0bd2e340 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/Upload.php @@ -0,0 +1,278 @@ + Error message templates */ + protected $messageTemplates = [ + self::INI_SIZE => "File '%value%' exceeds upload_max_filesize directive in php.ini", + self::FORM_SIZE => "File '%value%' exceeds the MAX_FILE_SIZE directive that was " + . 'specified in the HTML form', + self::PARTIAL => "File '%value%' was only partially uploaded", + self::NO_FILE => "File '%value%' was not uploaded", + self::NO_TMP_DIR => "Missing a temporary folder to store '%value%'", + self::CANT_WRITE => "Failed to write file '%value%' to disk", + self::EXTENSION => "A PHP extension stopped uploading the file '%value%'", + self::ATTACK => "File '%value%' was illegally uploaded. This could be a possible attack", + self::FILE_NOT_FOUND => "File '%value%' was not found", + self::UNKNOWN => "Unknown error while uploading file '%value%'", + ]; + + /** @var array */ + protected $options = [ + 'files' => [], + ]; + + /** + * Sets validator options + * + * The array $files must be given in syntax of Laminas\File\Transfer\Transfer to be checked + * If no files are given the $_FILES array will be used automatically. + * NOTE: This validator will only work with HTTP POST uploads! + * + * @param array|Traversable $options Array of files in syntax of \Laminas\File\Transfer\Transfer + */ + public function __construct($options = []) + { + if (is_array($options) && ! array_key_exists('files', $options)) { + $options = ['files' => $options]; + } + + parent::__construct($options); + } + + /** + * Returns the array of set files + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param string $file (Optional) The file to return in detail + * @return array + * @throws Exception\InvalidArgumentException If file is not found. + */ + public function getFiles($file = null) + { + if ($file !== null) { + $return = []; + foreach ($this->options['files'] as $name => $content) { + if ($name === $file) { + $return[$file] = $this->options['files'][$name]; + } + + if ($content instanceof UploadedFileInterface) { + if ($content->getClientFilename() === $file) { + $return[$name] = $this->options['files'][$name]; + } + } elseif ($content['name'] === $file) { + $return[$name] = $this->options['files'][$name]; + } + } + + if (! $return) { + throw new Exception\InvalidArgumentException("The file '$file' was not found"); + } + + return $return; + } + + return $this->options['files']; + } + + /** + * Sets the files to be checked + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param array $files The files to check in syntax of \Laminas\File\Transfer\Transfer + * @return $this Provides a fluent interface + */ + public function setFiles($files = []) + { + if ( + null === $files + || ((is_countable($files)) + && count($files) === 0) + ) { + $this->options['files'] = $_FILES; + } else { + $this->options['files'] = $files; + } + + if ($this->options['files'] === null) { + $this->options['files'] = []; + } + + foreach ($this->options['files'] as $file => $content) { + if ( + ! $content instanceof UploadedFileInterface + && ! isset($content['error']) + ) { + unset($this->options['files'][$file]); + } + } + + return $this; + } + + /** + * Returns true if and only if the file was uploaded without errors + * + * @param string $value Single file to check for upload errors, when giving null the $_FILES array + * from initialization will be used + * @param mixed $file + * @return bool + */ + public function isValid($value, $file = null) + { + $files = []; + $this->setValue($value); + if (array_key_exists($value, $this->getFiles())) { + $files = array_merge($files, $this->getFiles($value)); + } else { + foreach ($this->getFiles() as $file => $content) { + if ($content instanceof UploadedFileInterface) { + if ($content->getClientFilename() === $value) { + $files = array_merge($files, $this->getFiles($file)); + } + + // PSR cannot search by tmp_name because it does not have + // a public interface to get it, only user defined name + // from form field. + continue; + } + + if (isset($content['name']) && ($content['name'] === $value)) { + $files = array_merge($files, $this->getFiles($file)); + } + + if (isset($content['tmp_name']) && ($content['tmp_name'] === $value)) { + $files = array_merge($files, $this->getFiles($file)); + } + } + } + + if (empty($files)) { + return $this->throwError($file, self::FILE_NOT_FOUND); + } + + foreach ($files as $file => $content) { + $this->value = $file; + $error = $content instanceof UploadedFileInterface + ? $content->getError() + : $content['error']; + + switch ($error) { + case 0: + if ($content instanceof UploadedFileInterface) { + // done! + break; + } + + // For standard SAPI environments, check that the upload + // was valid + if (! is_uploaded_file($content['tmp_name'])) { + $this->throwError($content, self::ATTACK); + } + break; + + case 1: + $this->throwError($content, self::INI_SIZE); + break; + + case 2: + $this->throwError($content, self::FORM_SIZE); + break; + + case 3: + $this->throwError($content, self::PARTIAL); + break; + + case 4: + $this->throwError($content, self::NO_FILE); + break; + + case 6: + $this->throwError($content, self::NO_TMP_DIR); + break; + + case 7: + $this->throwError($content, self::CANT_WRITE); + break; + + case 8: + $this->throwError($content, self::EXTENSION); + break; + + default: + $this->throwError($content, self::UNKNOWN); + break; + } + } + + if ($this->getMessages()) { + return false; + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param array|string|UploadedFileInterface $file + * @param string $errorType + * @return false + */ + protected function throwError($file, $errorType) + { + if ($file !== null) { + if (is_array($file)) { + if (array_key_exists('name', $file)) { + $this->value = $file['name']; + } + } elseif (is_string($file)) { + $this->value = $file; + } elseif ($file instanceof UploadedFileInterface) { + $this->value = $file->getClientFilename(); + } + } + + $this->error($errorType); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/File/UploadFile.php b/vendor/laminas/laminas-validator/src/File/UploadFile.php new file mode 100644 index 00000000..bc8adac0 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/UploadFile.php @@ -0,0 +1,177 @@ + 'The uploaded file exceeds the upload_max_filesize directive in php.ini', + self::FORM_SIZE => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was ' + . 'specified in the HTML form', + self::PARTIAL => 'The uploaded file was only partially uploaded', + self::NO_FILE => 'No file was uploaded', + self::NO_TMP_DIR => 'Missing a temporary folder', + self::CANT_WRITE => 'Failed to write file to disk', + self::EXTENSION => 'A PHP extension stopped the file upload', + self::ATTACK => 'File was illegally uploaded. This could be a possible attack', + self::FILE_NOT_FOUND => 'File was not found', + self::UNKNOWN => 'Unknown error while uploading file', + ]; + + /** + * Returns true if and only if the file was uploaded without errors + * + * @param string|array|UploadedFileInterface $value File to check for upload errors + * @return bool + * @throws Exception\InvalidArgumentException + */ + public function isValid($value) + { + if (is_array($value)) { + if (! isset($value['tmp_name']) || ! isset($value['name']) || ! isset($value['error'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + + return $this->validateUploadedFile( + $value['error'], + $value['name'], + $value['tmp_name'] + ); + } + + if ($value instanceof UploadedFileInterface) { + return $this->validatePsr7UploadedFile($value); + } + + if (is_string($value)) { + return $this->validateUploadedFile(0, basename($value), $value); + } + + $this->error(self::UNKNOWN); + return false; + } + + /** + * @param int $error UPLOAD_ERR_* constant value + * @return bool + */ + private function validateFileFromErrorCode($error) + { + switch ($error) { + case UPLOAD_ERR_OK: + return true; + + case UPLOAD_ERR_INI_SIZE: + $this->error(self::INI_SIZE); + return false; + + case UPLOAD_ERR_FORM_SIZE: + $this->error(self::FORM_SIZE); + return false; + + case UPLOAD_ERR_PARTIAL: + $this->error(self::PARTIAL); + return false; + + case UPLOAD_ERR_NO_FILE: + $this->error(self::NO_FILE); + return false; + + case UPLOAD_ERR_NO_TMP_DIR: + $this->error(self::NO_TMP_DIR); + return false; + + case UPLOAD_ERR_CANT_WRITE: + $this->error(self::CANT_WRITE); + return false; + + case UPLOAD_ERR_EXTENSION: + $this->error(self::EXTENSION); + return false; + + default: + $this->error(self::UNKNOWN); + return false; + } + } + + /** + * @param int $error UPLOAD_ERR_* constant + * @param string $filename + * @param string $uploadedFile Name of uploaded file (gen tmp_name) + * @return bool + */ + private function validateUploadedFile($error, $filename, $uploadedFile) + { + $this->setValue($filename); + + // Normal errors can be validated normally + if ($error !== UPLOAD_ERR_OK) { + return $this->validateFileFromErrorCode($error); + } + + // Did we get no name? Is the file missing? + if (empty($uploadedFile) || false === is_file($uploadedFile)) { + $this->error(self::FILE_NOT_FOUND); + return false; + } + + // Do we have an invalid upload? + if (! is_uploaded_file($uploadedFile)) { + $this->error(self::ATTACK); + return false; + } + + return true; + } + + /** + * @return bool + */ + private function validatePsr7UploadedFile(UploadedFileInterface $uploadedFile) + { + $this->setValue($uploadedFile); + return $this->validateFileFromErrorCode($uploadedFile->getError()); + } +} diff --git a/vendor/laminas/laminas-validator/src/File/WordCount.php b/vendor/laminas/laminas-validator/src/File/WordCount.php new file mode 100644 index 00000000..73d22f9d --- /dev/null +++ b/vendor/laminas/laminas-validator/src/File/WordCount.php @@ -0,0 +1,214 @@ + "Too many words, maximum '%max%' are allowed but '%count%' were counted", + self::TOO_LESS => "Too few words, minimum '%min%' are expected but '%count%' were counted", + self::NOT_FOUND => 'File is not readable or does not exist', + ]; + + /** @var array Error message template variables */ + protected $messageVariables = [ + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + 'count' => 'count', + ]; + + /** + * Word count + * + * @var int + */ + protected $count; + + /** + * Options for this validator + * + * @var array + */ + protected $options = [ + 'min' => null, // Minimum word count, if null there is no minimum word count + 'max' => null, // Maximum word count, if null there is no maximum word count + ]; + + /** + * Sets validator options + * + * Min limits the word count, when used with max=null it is the maximum word count + * It also accepts an array with the keys 'min' and 'max' + * + * If $options is an integer, it will be used as maximum word count + * As Array is accepts the following keys: + * 'min': Minimum word count + * 'max': Maximum word count + * + * @param int|array|Traversable $options Options for the adapter + */ + public function __construct($options = null) + { + if (1 < func_num_args()) { + $args = func_get_args(); + $options = [ + 'min' => array_shift($args), + 'max' => array_shift($args), + ]; + } + + if (is_string($options) || is_numeric($options)) { + $options = ['max' => $options]; + } + + parent::__construct($options); + } + + /** + * Returns the minimum word count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the minimum word count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int|array $min The minimum word count + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When min is greater than max. + */ + public function setMin($min) + { + if (is_array($min) && isset($min['min'])) { + $min = $min['min']; + } + + if (! is_numeric($min)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $min = (int) $min; + if (($this->getMax() !== null) && ($min > $this->getMax())) { + throw new Exception\InvalidArgumentException( + "The minimum must be less than or equal to the maximum word count, but $min > {$this->getMax()}" + ); + } + + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the maximum word count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @return int + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the maximum file count + * + * @deprecated Since 2.61.0 - All getters and setters will be removed in 3.0 + * + * @param int|array $max The maximum word count + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When max is smaller than min. + */ + public function setMax($max) + { + if (is_array($max) && isset($max['max'])) { + $max = $max['max']; + } + + if (! is_numeric($max)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $max = (int) $max; + if (($this->getMin() !== null) && ($max < $this->getMin())) { + throw new Exception\InvalidArgumentException( + "The maximum must be greater than or equal to the minimum word count, but $max < {$this->getMin()}" + ); + } + + $this->options['max'] = $max; + return $this; + } + + /** + * Returns true if and only if the counted words are at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value Filename to check for word count + * @param array $file File data from \Laminas\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + $fileInfo = $this->getFileInfo($value, $file); + + $this->setValue($fileInfo['filename']); + + // Is file readable ? + if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) { + $this->error(self::NOT_FOUND); + return false; + } + + $content = file_get_contents($fileInfo['file']); + $this->count = str_word_count($content); + if (($this->getMax() !== null) && ($this->count > $this->getMax())) { + $this->error(self::TOO_MUCH); + return false; + } + + if (($this->getMin() !== null) && ($this->count < $this->getMin())) { + $this->error(self::TOO_LESS); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/GpsPoint.php b/vendor/laminas/laminas-validator/src/GpsPoint.php new file mode 100644 index 00000000..93918495 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/GpsPoint.php @@ -0,0 +1,112 @@ + '%value% is out of Bounds.', + self::CONVERT_ERROR => '%value% can not converted into a Decimal Degree Value.', + self::INCOMPLETE_COORDINATE => '%value% did not provided a complete Coordinate', + ]; + + /** + * Returns true if and only if $value meets the validation requirements + * + * If $value fails validation, then this method returns false, and + * getMessages() will return an array of messages that explain why the + * validation failed. + * + * @throws Exception\RuntimeException If validation of $value is impossible. + */ + public function isValid(mixed $value): bool + { + if (! str_contains($value, ',')) { + $this->error(self::INCOMPLETE_COORDINATE, $value); + return false; + } + + [$lat, $long] = explode(',', $value); + + return $this->isValidCoordinate($lat, 90.0000) && $this->isValidCoordinate($long, 180.000); + } + + private function isValidCoordinate(string $value, float $maxBoundary): bool + { + $this->value = $value; + + $value = $this->removeWhiteSpace($value); + if ($this->isDMSValue($value)) { + $value = $this->convertValue($value); + } else { + $value = $this->removeDegreeSign($value); + } + + if ($value === false) { + $this->error(self::CONVERT_ERROR); + return false; + } + + $castedValue = (float) $value; + if (! is_numeric($value) && $castedValue === 0.0) { + $this->error(self::CONVERT_ERROR); + return false; + } + + if (! $this->isValueInbound($castedValue, $maxBoundary)) { + $this->error(self::OUT_OF_BOUNDS); + return false; + } + + return true; + } + + /** + * Determines if the give value is a Degrees Minutes Second Definition + */ + private function isDMSValue(string $value): bool + { + return preg_match('/([°\'"]+[NESW])/', $value) > 0; + } + + private function convertValue(string $value): false|float + { + $matches = []; + $result = preg_match_all('/(\d{1,3})°(\d{1,2})\'(\d{1,2}[\.\d]{0,6})"[NESW]/i', $value, $matches); + + if ($result === false || $result === 0) { + return false; + } + + return $matches[1][0] + $matches[2][0] / 60 + ((float) $matches[3][0]) / 3600; + } + + private function removeWhiteSpace(string $value): string + { + return preg_replace('/\s/', '', $value); + } + + private function removeDegreeSign(string $value): string + { + return str_replace('°', '', $value); + } + + private function isValueInbound(float $value, float $boundary): bool + { + $max = $boundary; + $min = -1 * $boundary; + return $min <= $value && $value <= $max; + } +} diff --git a/vendor/laminas/laminas-validator/src/GreaterThan.php b/vendor/laminas/laminas-validator/src/GreaterThan.php new file mode 100644 index 00000000..eb5cf997 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/GreaterThan.php @@ -0,0 +1,158 @@ + "The input is not greater than '%min%'", + self::NOT_GREATER_INCLUSIVE => "The input is not greater than or equal to '%min%'", + ]; + + /** @var array */ + protected $messageVariables = [ + 'min' => 'min', + ]; + + /** + * Minimum value + * + * @var mixed + */ + protected $min; + + /** + * Whether to do inclusive comparisons, allowing equivalence to max + * + * If false, then strict comparisons are done, and the value may equal + * the min option + * + * @var bool + */ + protected $inclusive; + + /** + * Sets validator options + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (! is_array($options)) { + $options = func_get_args(); + $temp['min'] = array_shift($options); + + if (! empty($options)) { + $temp['inclusive'] = array_shift($options); + } + + $options = $temp; + } + + if (! array_key_exists('min', $options)) { + throw new Exception\InvalidArgumentException("Missing option 'min'"); + } + + if (! array_key_exists('inclusive', $options)) { + $options['inclusive'] = false; + } + + $this->setMin($options['min']) + ->setInclusive($options['inclusive']); + + parent::__construct($options); + } + + /** + * Returns the min option + * + * @return mixed + */ + public function getMin() + { + return $this->min; + } + + /** + * Sets the min option + * + * @return $this Provides a fluent interface + */ + public function setMin(mixed $min) + { + $this->min = $min; + return $this; + } + + /** + * Returns the inclusive option + * + * @return bool + */ + public function getInclusive() + { + return $this->inclusive; + } + + /** + * Sets the inclusive option + * + * @param bool $inclusive + * @return $this Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->inclusive = $inclusive; + return $this; + } + + /** + * Returns true if and only if $value is greater than min option + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if ($this->inclusive) { + if ($this->min > $value) { + $this->error(self::NOT_GREATER_INCLUSIVE); + return false; + } + } else { + if ($this->min >= $value) { + $this->error(self::NOT_GREATER); + return false; + } + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Hex.php b/vendor/laminas/laminas-validator/src/Hex.php new file mode 100644 index 00000000..4f6a18c3 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Hex.php @@ -0,0 +1,46 @@ + 'Invalid type given. String expected', + self::NOT_HEX => 'The input contains non-hexadecimal characters', + ]; + + /** + * Returns true if and only if $value contains only hexadecimal digit characters + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value) && ! is_int($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + if (! ctype_xdigit((string) $value)) { + $this->error(self::NOT_HEX); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/HostWithPublicIPv4Address.php b/vendor/laminas/laminas-validator/src/HostWithPublicIPv4Address.php new file mode 100644 index 00000000..3ac88a7a --- /dev/null +++ b/vendor/laminas/laminas-validator/src/HostWithPublicIPv4Address.php @@ -0,0 +1,158 @@ + */ + protected array $messageTemplates = [ + self::ERROR_NOT_STRING => 'Expected a string hostname but received %type%', + self::ERROR_HOSTNAME_NOT_RESOLVED => 'The hostname "%value%" cannot be resolved', + self::ERROR_PRIVATE_IP_FOUND => 'The hostname "%value%" resolves to at least one reserved IPv4 address', + ]; + + protected string $type = 'null'; + + /** @var array */ + protected array $messageVariables = [ + 'type' => 'type', + 'value' => 'value', + ]; + + public function isValid(mixed $value): bool + { + $this->type = get_debug_type($value); + + if (! is_string($value)) { + $this->error(self::ERROR_NOT_STRING); + + return false; + } + + $this->value = $value; + + if (filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) { + $addressList = gethostbynamel($value); + } else { + $addressList = [$value]; + } + + if (! is_array($addressList)) { + $this->error(self::ERROR_HOSTNAME_NOT_RESOLVED); + + return false; + } + + $privateAddressWasFound = false; + + $filterFlags = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE; + if (PHP_VERSION_ID >= 80200) { + /** + * @psalm-var int $filterFlags + * @psalm-suppress UndefinedConstant + */ + $filterFlags |= FILTER_FLAG_GLOBAL_RANGE; + } + + foreach ($addressList as $server) { + /** + * Initially test with PHP's built-in filter_var features as this will be quicker than checking + * presence with a CIDR + */ + if (filter_var($server, FILTER_VALIDATE_IP, $filterFlags) === false) { + $privateAddressWasFound = true; + + break; + } + + if ($this->inReservedCidr($server)) { + $privateAddressWasFound = true; + + break; + } + } + + if ($privateAddressWasFound) { + $this->error(self::ERROR_PRIVATE_IP_FOUND); + + return false; + } + + return true; + } + + private function inReservedCidr(string $ip): bool + { + foreach (self::RESERVED_CIDR as $cidr) { + $cidr = explode('/', $cidr); + $startIp = ip2long($cidr[0]); + $endIp = ip2long($cidr[0]) + pow(2, 32 - (int) $cidr[1]) - 1; + + $int = ip2long($ip); + + if ($int >= $startIp && $int <= $endIp) { + return true; + } + } + + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/Hostname.php b/vendor/laminas/laminas-validator/src/Hostname.php new file mode 100644 index 00000000..f37c3ed9 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Hostname.php @@ -0,0 +1,2286 @@ +, + * useIdnCheck?: bool, + * useTldCheck?: bool, + * ipValidator?: null|ValidatorInterface, + * } + * @final + */ +class Hostname extends AbstractValidator +{ + public const CANNOT_DECODE_PUNYCODE = 'hostnameCannotDecodePunycode'; + public const INVALID = 'hostnameInvalid'; + public const INVALID_DASH = 'hostnameDashCharacter'; + public const INVALID_HOSTNAME = 'hostnameInvalidHostname'; + public const INVALID_HOSTNAME_SCHEMA = 'hostnameInvalidHostnameSchema'; + public const INVALID_LOCAL_NAME = 'hostnameInvalidLocalName'; + public const INVALID_URI = 'hostnameInvalidUri'; + public const IP_ADDRESS_NOT_ALLOWED = 'hostnameIpAddressNotAllowed'; + public const LOCAL_NAME_NOT_ALLOWED = 'hostnameLocalNameNotAllowed'; + public const UNDECIPHERABLE_TLD = 'hostnameUndecipherableTld'; + public const UNKNOWN_TLD = 'hostnameUnknownTld'; + + /** @var array */ + protected $messageTemplates = [ + self::CANNOT_DECODE_PUNYCODE => "The input appears to be a DNS hostname but the given punycode notation cannot be decoded", + self::INVALID => "Invalid type given. String expected", + self::INVALID_DASH => "The input appears to be a DNS hostname but contains a dash in an invalid position", + self::INVALID_HOSTNAME => "The input does not match the expected structure for a DNS hostname", + self::INVALID_HOSTNAME_SCHEMA => "The input appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'", + self::INVALID_LOCAL_NAME => "The input does not appear to be a valid local network name", + self::INVALID_URI => "The input does not appear to be a valid URI hostname", + self::IP_ADDRESS_NOT_ALLOWED => "The input appears to be an IP address, but IP addresses are not allowed", + self::LOCAL_NAME_NOT_ALLOWED => "The input appears to be a local network name but local network names are not allowed", + self::UNDECIPHERABLE_TLD => "The input appears to be a DNS hostname but cannot extract TLD part", + self::UNKNOWN_TLD => "The input appears to be a DNS hostname but cannot match TLD against known list", + ]; + + /** @var array */ + protected $messageVariables = [ + 'tld' => 'tld', + ]; + + public const ALLOW_DNS = 1; // Allows Internet domain names (e.g., example.com) + public const ALLOW_IP = 2; // Allows IP addresses + public const ALLOW_LOCAL = 4; // Allows local network names (e.g., localhost, www.localdomain) + public const ALLOW_URI = 8; // Allows URI hostnames + public const ALLOW_ALL = 15; // Allows all types of hostnames + + /** + * Array of valid top-level-domains + * + * @see ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt List of all TLDs by domain + * @see http://www.iana.org/domains/root/db/ Official list of supported TLDs + * + * @var string[] + */ + protected $validTlds = [ + 'aaa', + 'aarp', + 'abb', + 'abbott', + 'abbvie', + 'abc', + 'able', + 'abogado', + 'abudhabi', + 'ac', + 'academy', + 'accenture', + 'accountant', + 'accountants', + 'aco', + 'actor', + 'ad', + 'ads', + 'adult', + 'ae', + 'aeg', + 'aero', + 'aetna', + 'af', + 'afl', + 'africa', + 'ag', + 'agakhan', + 'agency', + 'ai', + 'aig', + 'airbus', + 'airforce', + 'airtel', + 'akdn', + 'al', + 'alibaba', + 'alipay', + 'allfinanz', + 'allstate', + 'ally', + 'alsace', + 'alstom', + 'am', + 'amazon', + 'americanexpress', + 'americanfamily', + 'amex', + 'amfam', + 'amica', + 'amsterdam', + 'analytics', + 'android', + 'anquan', + 'anz', + 'ao', + 'aol', + 'apartments', + 'app', + 'apple', + 'aq', + 'aquarelle', + 'ar', + 'arab', + 'aramco', + 'archi', + 'army', + 'arpa', + 'art', + 'arte', + 'as', + 'asda', + 'asia', + 'associates', + 'at', + 'athleta', + 'attorney', + 'au', + 'auction', + 'audi', + 'audible', + 'audio', + 'auspost', + 'author', + 'auto', + 'autos', + 'aw', + 'aws', + 'ax', + 'axa', + 'az', + 'azure', + 'ba', + 'baby', + 'baidu', + 'banamex', + 'band', + 'bank', + 'bar', + 'barcelona', + 'barclaycard', + 'barclays', + 'barefoot', + 'bargains', + 'baseball', + 'basketball', + 'bauhaus', + 'bayern', + 'bb', + 'bbc', + 'bbt', + 'bbva', + 'bcg', + 'bcn', + 'bd', + 'be', + 'beats', + 'beauty', + 'beer', + 'bentley', + 'berlin', + 'best', + 'bestbuy', + 'bet', + 'bf', + 'bg', + 'bh', + 'bharti', + 'bi', + 'bible', + 'bid', + 'bike', + 'bing', + 'bingo', + 'bio', + 'biz', + 'bj', + 'black', + 'blackfriday', + 'blockbuster', + 'blog', + 'bloomberg', + 'blue', + 'bm', + 'bms', + 'bmw', + 'bn', + 'bnpparibas', + 'bo', + 'boats', + 'boehringer', + 'bofa', + 'bom', + 'bond', + 'boo', + 'book', + 'booking', + 'bosch', + 'bostik', + 'boston', + 'bot', + 'boutique', + 'box', + 'br', + 'bradesco', + 'bridgestone', + 'broadway', + 'broker', + 'brother', + 'brussels', + 'bs', + 'bt', + 'build', + 'builders', + 'business', + 'buy', + 'buzz', + 'bv', + 'bw', + 'by', + 'bz', + 'bzh', + 'ca', + 'cab', + 'cafe', + 'cal', + 'call', + 'calvinklein', + 'cam', + 'camera', + 'camp', + 'canon', + 'capetown', + 'capital', + 'capitalone', + 'car', + 'caravan', + 'cards', + 'care', + 'career', + 'careers', + 'cars', + 'casa', + 'case', + 'cash', + 'casino', + 'cat', + 'catering', + 'catholic', + 'cba', + 'cbn', + 'cbre', + 'cc', + 'cd', + 'center', + 'ceo', + 'cern', + 'cf', + 'cfa', + 'cfd', + 'cg', + 'ch', + 'chanel', + 'channel', + 'charity', + 'chase', + 'chat', + 'cheap', + 'chintai', + 'christmas', + 'chrome', + 'church', + 'ci', + 'cipriani', + 'circle', + 'cisco', + 'citadel', + 'citi', + 'citic', + 'city', + 'ck', + 'cl', + 'claims', + 'cleaning', + 'click', + 'clinic', + 'clinique', + 'clothing', + 'cloud', + 'club', + 'clubmed', + 'cm', + 'cn', + 'co', + 'coach', + 'codes', + 'coffee', + 'college', + 'cologne', + 'com', + 'commbank', + 'community', + 'company', + 'compare', + 'computer', + 'comsec', + 'condos', + 'construction', + 'consulting', + 'contact', + 'contractors', + 'cooking', + 'cool', + 'coop', + 'corsica', + 'country', + 'coupon', + 'coupons', + 'courses', + 'cpa', + 'cr', + 'credit', + 'creditcard', + 'creditunion', + 'cricket', + 'crown', + 'crs', + 'cruise', + 'cruises', + 'cu', + 'cuisinella', + 'cv', + 'cw', + 'cx', + 'cy', + 'cymru', + 'cyou', + 'cz', + 'dabur', + 'dad', + 'dance', + 'data', + 'date', + 'dating', + 'datsun', + 'day', + 'dclk', + 'dds', + 'de', + 'deal', + 'dealer', + 'deals', + 'degree', + 'delivery', + 'dell', + 'deloitte', + 'delta', + 'democrat', + 'dental', + 'dentist', + 'desi', + 'design', + 'dev', + 'dhl', + 'diamonds', + 'diet', + 'digital', + 'direct', + 'directory', + 'discount', + 'discover', + 'dish', + 'diy', + 'dj', + 'dk', + 'dm', + 'dnp', + 'do', + 'docs', + 'doctor', + 'dog', + 'domains', + 'dot', + 'download', + 'drive', + 'dtv', + 'dubai', + 'dunlop', + 'dupont', + 'durban', + 'dvag', + 'dvr', + 'dz', + 'earth', + 'eat', + 'ec', + 'eco', + 'edeka', + 'edu', + 'education', + 'ee', + 'eg', + 'email', + 'emerck', + 'energy', + 'engineer', + 'engineering', + 'enterprises', + 'epson', + 'equipment', + 'er', + 'ericsson', + 'erni', + 'es', + 'esq', + 'estate', + 'et', + 'eu', + 'eurovision', + 'eus', + 'events', + 'exchange', + 'expert', + 'exposed', + 'express', + 'extraspace', + 'fage', + 'fail', + 'fairwinds', + 'faith', + 'family', + 'fan', + 'fans', + 'farm', + 'farmers', + 'fashion', + 'fast', + 'fedex', + 'feedback', + 'ferrari', + 'ferrero', + 'fi', + 'fidelity', + 'fido', + 'film', + 'final', + 'finance', + 'financial', + 'fire', + 'firestone', + 'firmdale', + 'fish', + 'fishing', + 'fit', + 'fitness', + 'fj', + 'fk', + 'flickr', + 'flights', + 'flir', + 'florist', + 'flowers', + 'fly', + 'fm', + 'fo', + 'foo', + 'food', + 'football', + 'ford', + 'forex', + 'forsale', + 'forum', + 'foundation', + 'fox', + 'fr', + 'free', + 'fresenius', + 'frl', + 'frogans', + 'frontier', + 'ftr', + 'fujitsu', + 'fun', + 'fund', + 'furniture', + 'futbol', + 'fyi', + 'ga', + 'gal', + 'gallery', + 'gallo', + 'gallup', + 'game', + 'games', + 'gap', + 'garden', + 'gay', + 'gb', + 'gbiz', + 'gd', + 'gdn', + 'ge', + 'gea', + 'gent', + 'genting', + 'george', + 'gf', + 'gg', + 'ggee', + 'gh', + 'gi', + 'gift', + 'gifts', + 'gives', + 'giving', + 'gl', + 'glass', + 'gle', + 'global', + 'globo', + 'gm', + 'gmail', + 'gmbh', + 'gmo', + 'gmx', + 'gn', + 'godaddy', + 'gold', + 'goldpoint', + 'golf', + 'goo', + 'goodyear', + 'goog', + 'google', + 'gop', + 'got', + 'gov', + 'gp', + 'gq', + 'gr', + 'grainger', + 'graphics', + 'gratis', + 'green', + 'gripe', + 'grocery', + 'group', + 'gs', + 'gt', + 'gu', + 'gucci', + 'guge', + 'guide', + 'guitars', + 'guru', + 'gw', + 'gy', + 'hair', + 'hamburg', + 'hangout', + 'haus', + 'hbo', + 'hdfc', + 'hdfcbank', + 'health', + 'healthcare', + 'help', + 'helsinki', + 'here', + 'hermes', + 'hiphop', + 'hisamitsu', + 'hitachi', + 'hiv', + 'hk', + 'hkt', + 'hm', + 'hn', + 'hockey', + 'holdings', + 'holiday', + 'homedepot', + 'homegoods', + 'homes', + 'homesense', + 'honda', + 'horse', + 'hospital', + 'host', + 'hosting', + 'hot', + 'hotels', + 'hotmail', + 'house', + 'how', + 'hr', + 'hsbc', + 'ht', + 'hu', + 'hughes', + 'hyatt', + 'hyundai', + 'ibm', + 'icbc', + 'ice', + 'icu', + 'id', + 'ie', + 'ieee', + 'ifm', + 'ikano', + 'il', + 'im', + 'imamat', + 'imdb', + 'immo', + 'immobilien', + 'in', + 'inc', + 'industries', + 'infiniti', + 'info', + 'ing', + 'ink', + 'institute', + 'insurance', + 'insure', + 'int', + 'international', + 'intuit', + 'investments', + 'io', + 'ipiranga', + 'iq', + 'ir', + 'irish', + 'is', + 'ismaili', + 'ist', + 'istanbul', + 'it', + 'itau', + 'itv', + 'jaguar', + 'java', + 'jcb', + 'je', + 'jeep', + 'jetzt', + 'jewelry', + 'jio', + 'jll', + 'jm', + 'jmp', + 'jnj', + 'jo', + 'jobs', + 'joburg', + 'jot', + 'joy', + 'jp', + 'jpmorgan', + 'jprs', + 'juegos', + 'juniper', + 'kaufen', + 'kddi', + 'ke', + 'kerryhotels', + 'kerrylogistics', + 'kerryproperties', + 'kfh', + 'kg', + 'kh', + 'ki', + 'kia', + 'kids', + 'kim', + 'kindle', + 'kitchen', + 'kiwi', + 'km', + 'kn', + 'koeln', + 'komatsu', + 'kosher', + 'kp', + 'kpmg', + 'kpn', + 'kr', + 'krd', + 'kred', + 'kuokgroup', + 'kw', + 'ky', + 'kyoto', + 'kz', + 'la', + 'lacaixa', + 'lamborghini', + 'lamer', + 'lancaster', + 'land', + 'landrover', + 'lanxess', + 'lasalle', + 'lat', + 'latino', + 'latrobe', + 'law', + 'lawyer', + 'lb', + 'lc', + 'lds', + 'lease', + 'leclerc', + 'lefrak', + 'legal', + 'lego', + 'lexus', + 'lgbt', + 'li', + 'lidl', + 'life', + 'lifeinsurance', + 'lifestyle', + 'lighting', + 'like', + 'lilly', + 'limited', + 'limo', + 'lincoln', + 'link', + 'lipsy', + 'live', + 'living', + 'lk', + 'llc', + 'llp', + 'loan', + 'loans', + 'locker', + 'locus', + 'lol', + 'london', + 'lotte', + 'lotto', + 'love', + 'lpl', + 'lplfinancial', + 'lr', + 'ls', + 'lt', + 'ltd', + 'ltda', + 'lu', + 'lundbeck', + 'luxe', + 'luxury', + 'lv', + 'ly', + 'ma', + 'madrid', + 'maif', + 'maison', + 'makeup', + 'man', + 'management', + 'mango', + 'map', + 'market', + 'marketing', + 'markets', + 'marriott', + 'marshalls', + 'mattel', + 'mba', + 'mc', + 'mckinsey', + 'md', + 'me', + 'med', + 'media', + 'meet', + 'melbourne', + 'meme', + 'memorial', + 'men', + 'menu', + 'merckmsd', + 'mg', + 'mh', + 'miami', + 'microsoft', + 'mil', + 'mini', + 'mint', + 'mit', + 'mitsubishi', + 'mk', + 'ml', + 'mlb', + 'mls', + 'mm', + 'mma', + 'mn', + 'mo', + 'mobi', + 'mobile', + 'moda', + 'moe', + 'moi', + 'mom', + 'monash', + 'money', + 'monster', + 'mormon', + 'mortgage', + 'moscow', + 'moto', + 'motorcycles', + 'mov', + 'movie', + 'mp', + 'mq', + 'mr', + 'ms', + 'msd', + 'mt', + 'mtn', + 'mtr', + 'mu', + 'museum', + 'music', + 'mv', + 'mw', + 'mx', + 'my', + 'mz', + 'na', + 'nab', + 'nagoya', + 'name', + 'navy', + 'nba', + 'nc', + 'ne', + 'nec', + 'net', + 'netbank', + 'netflix', + 'network', + 'neustar', + 'new', + 'news', + 'next', + 'nextdirect', + 'nexus', + 'nf', + 'nfl', + 'ng', + 'ngo', + 'nhk', + 'ni', + 'nico', + 'nike', + 'nikon', + 'ninja', + 'nissan', + 'nissay', + 'nl', + 'no', + 'nokia', + 'norton', + 'now', + 'nowruz', + 'nowtv', + 'np', + 'nr', + 'nra', + 'nrw', + 'ntt', + 'nu', + 'nyc', + 'nz', + 'obi', + 'observer', + 'office', + 'okinawa', + 'olayan', + 'olayangroup', + 'ollo', + 'om', + 'omega', + 'one', + 'ong', + 'onl', + 'online', + 'ooo', + 'open', + 'oracle', + 'orange', + 'org', + 'organic', + 'origins', + 'osaka', + 'otsuka', + 'ott', + 'ovh', + 'pa', + 'page', + 'panasonic', + 'paris', + 'pars', + 'partners', + 'parts', + 'party', + 'pay', + 'pccw', + 'pe', + 'pet', + 'pf', + 'pfizer', + 'pg', + 'ph', + 'pharmacy', + 'phd', + 'philips', + 'phone', + 'photo', + 'photography', + 'photos', + 'physio', + 'pics', + 'pictet', + 'pictures', + 'pid', + 'pin', + 'ping', + 'pink', + 'pioneer', + 'pizza', + 'pk', + 'pl', + 'place', + 'play', + 'playstation', + 'plumbing', + 'plus', + 'pm', + 'pn', + 'pnc', + 'pohl', + 'poker', + 'politie', + 'porn', + 'post', + 'pr', + 'pramerica', + 'praxi', + 'press', + 'prime', + 'pro', + 'prod', + 'productions', + 'prof', + 'progressive', + 'promo', + 'properties', + 'property', + 'protection', + 'pru', + 'prudential', + 'ps', + 'pt', + 'pub', + 'pw', + 'pwc', + 'py', + 'qa', + 'qpon', + 'quebec', + 'quest', + 'racing', + 'radio', + 're', + 'read', + 'realestate', + 'realtor', + 'realty', + 'recipes', + 'red', + 'redstone', + 'redumbrella', + 'rehab', + 'reise', + 'reisen', + 'reit', + 'reliance', + 'ren', + 'rent', + 'rentals', + 'repair', + 'report', + 'republican', + 'rest', + 'restaurant', + 'review', + 'reviews', + 'rexroth', + 'rich', + 'richardli', + 'ricoh', + 'ril', + 'rio', + 'rip', + 'ro', + 'rocks', + 'rodeo', + 'rogers', + 'room', + 'rs', + 'rsvp', + 'ru', + 'rugby', + 'ruhr', + 'run', + 'rw', + 'rwe', + 'ryukyu', + 'sa', + 'saarland', + 'safe', + 'safety', + 'sakura', + 'sale', + 'salon', + 'samsclub', + 'samsung', + 'sandvik', + 'sandvikcoromant', + 'sanofi', + 'sap', + 'sarl', + 'sas', + 'save', + 'saxo', + 'sb', + 'sbi', + 'sbs', + 'sc', + 'scb', + 'schaeffler', + 'schmidt', + 'scholarships', + 'school', + 'schule', + 'schwarz', + 'science', + 'scot', + 'sd', + 'se', + 'search', + 'seat', + 'secure', + 'security', + 'seek', + 'select', + 'sener', + 'services', + 'seven', + 'sew', + 'sex', + 'sexy', + 'sfr', + 'sg', + 'sh', + 'shangrila', + 'sharp', + 'shell', + 'shia', + 'shiksha', + 'shoes', + 'shop', + 'shopping', + 'shouji', + 'show', + 'si', + 'silk', + 'sina', + 'singles', + 'site', + 'sj', + 'sk', + 'ski', + 'skin', + 'sky', + 'skype', + 'sl', + 'sling', + 'sm', + 'smart', + 'smile', + 'sn', + 'sncf', + 'so', + 'soccer', + 'social', + 'softbank', + 'software', + 'sohu', + 'solar', + 'solutions', + 'song', + 'sony', + 'soy', + 'spa', + 'space', + 'sport', + 'spot', + 'sr', + 'srl', + 'ss', + 'st', + 'stada', + 'staples', + 'star', + 'statebank', + 'statefarm', + 'stc', + 'stcgroup', + 'stockholm', + 'storage', + 'store', + 'stream', + 'studio', + 'study', + 'style', + 'su', + 'sucks', + 'supplies', + 'supply', + 'support', + 'surf', + 'surgery', + 'suzuki', + 'sv', + 'swatch', + 'swiss', + 'sx', + 'sy', + 'sydney', + 'systems', + 'sz', + 'tab', + 'taipei', + 'talk', + 'taobao', + 'target', + 'tatamotors', + 'tatar', + 'tattoo', + 'tax', + 'taxi', + 'tc', + 'tci', + 'td', + 'tdk', + 'team', + 'tech', + 'technology', + 'tel', + 'temasek', + 'tennis', + 'teva', + 'tf', + 'tg', + 'th', + 'thd', + 'theater', + 'theatre', + 'tiaa', + 'tickets', + 'tienda', + 'tips', + 'tires', + 'tirol', + 'tj', + 'tjmaxx', + 'tjx', + 'tk', + 'tkmaxx', + 'tl', + 'tm', + 'tmall', + 'tn', + 'to', + 'today', + 'tokyo', + 'tools', + 'top', + 'toray', + 'toshiba', + 'total', + 'tours', + 'town', + 'toyota', + 'toys', + 'tr', + 'trade', + 'trading', + 'training', + 'travel', + 'travelers', + 'travelersinsurance', + 'trust', + 'trv', + 'tt', + 'tube', + 'tui', + 'tunes', + 'tushu', + 'tv', + 'tvs', + 'tw', + 'tz', + 'ua', + 'ubank', + 'ubs', + 'ug', + 'uk', + 'unicom', + 'university', + 'uno', + 'uol', + 'ups', + 'us', + 'uy', + 'uz', + 'va', + 'vacations', + 'vana', + 'vanguard', + 'vc', + 've', + 'vegas', + 'ventures', + 'verisign', + 'versicherung', + 'vet', + 'vg', + 'vi', + 'viajes', + 'video', + 'vig', + 'viking', + 'villas', + 'vin', + 'vip', + 'virgin', + 'visa', + 'vision', + 'viva', + 'vivo', + 'vlaanderen', + 'vn', + 'vodka', + 'volvo', + 'vote', + 'voting', + 'voto', + 'voyage', + 'vu', + 'wales', + 'walmart', + 'walter', + 'wang', + 'wanggou', + 'watch', + 'watches', + 'weather', + 'weatherchannel', + 'webcam', + 'weber', + 'website', + 'wed', + 'wedding', + 'weibo', + 'weir', + 'wf', + 'whoswho', + 'wien', + 'wiki', + 'williamhill', + 'win', + 'windows', + 'wine', + 'winners', + 'wme', + 'wolterskluwer', + 'woodside', + 'work', + 'works', + 'world', + 'wow', + 'ws', + 'wtc', + 'wtf', + 'xbox', + 'xerox', + 'xihuan', + 'xin', + 'कॉम', + 'セール', + '佛山', + 'ಭಾರತ', + '慈善', + '集团', + '在线', + '한국', + 'ଭାରତ', + '点看', + 'คอม', + 'ভাৰত', + 'ভারত', + '八卦', + 'ישראל', + 'موقع', + 'বাংলা', + '公益', + '公司', + '香格里拉', + '网站', + '移动', + '我爱你', + 'москва', + 'қаз', + 'католик', + 'онлайн', + 'сайт', + '联通', + 'срб', + 'бг', + 'бел', + 'קום', + '时尚', + '微博', + '淡马锡', + 'ファッション', + 'орг', + 'नेट', + 'ストア', + 'アマゾン', + '삼성', + 'சிங்கப்பூர்', + '商标', + '商店', + '商城', + 'дети', + 'мкд', + 'ею', + 'ポイント', + '新闻', + '家電', + 'كوم', + '中文网', + '中信', + '中国', + '中國', + '娱乐', + '谷歌', + 'భారత్', + 'ලංකා', + '電訊盈科', + '购物', + 'クラウド', + 'ભારત', + '通販', + 'भारतम्', + 'भारत', + 'भारोत', + '网店', + 'संगठन', + '餐厅', + '网络', + 'ком', + 'укр', + '香港', + '亚马逊', + '食品', + '飞利浦', + '台湾', + '台灣', + '手机', + 'мон', + 'الجزائر', + 'عمان', + 'ارامكو', + 'ایران', + 'العليان', + 'امارات', + 'بازار', + 'موريتانيا', + 'پاکستان', + 'الاردن', + 'بارت', + 'بھارت', + 'المغرب', + 'ابوظبي', + 'البحرين', + 'السعودية', + 'ڀارت', + 'كاثوليك', + 'سودان', + 'همراه', + 'عراق', + 'مليسيا', + '澳門', + '닷컴', + '政府', + 'شبكة', + 'بيتك', + 'عرب', + 'გე', + '机构', + '组织机构', + '健康', + 'ไทย', + 'سورية', + '招聘', + 'рус', + 'рф', + 'تونس', + '大拿', + 'ລາວ', + 'みんな', + 'グーグル', + 'ευ', + 'ελ', + '世界', + '書籍', + 'ഭാരതം', + 'ਭਾਰਤ', + '网址', + '닷넷', + 'コム', + '天主教', + '游戏', + 'vermögensberater', + 'vermögensberatung', + '企业', + '信息', + '嘉里大酒店', + '嘉里', + 'مصر', + 'قطر', + '广东', + 'இலங்கை', + 'இந்தியா', + 'հայ', + '新加坡', + 'فلسطين', + '政务', + 'xxx', + 'xyz', + 'yachts', + 'yahoo', + 'yamaxun', + 'yandex', + 'ye', + 'yodobashi', + 'yoga', + 'yokohama', + 'you', + 'youtube', + 'yt', + 'yun', + 'za', + 'zappos', + 'zara', + 'zero', + 'zip', + 'zm', + 'zone', + 'zuerich', + 'zw', + ]; + + /** + * Array for valid Idns + * + * @see http://www.iana.org/domains/idn-tables/ Official list of supported IDN Chars + * (.AC) Ascension Island http://www.nic.ac/pdf/AC-IDN-Policy.pdf + * (.AR) Argentina http://www.nic.ar/faqidn.html + * (.AS) American Samoa http://www.nic.as/idn/chars.cfm + * (.AT) Austria http://www.nic.at/en/service/technical_information/idn/charset_converter/ + * (.BIZ) International http://www.iana.org/domains/idn-tables/ + * (.BR) Brazil http://registro.br/faq/faq6.html + * (.BV) Bouvett Island http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.CAT) Catalan http://www.iana.org/domains/idn-tables/tables/cat_ca_1.0.html + * (.CH) Switzerland https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 + * (.CL) Chile http://www.iana.org/domains/idn-tables/tables/cl_latn_1.0.html + * (.COM) International http://www.verisign.com/information-services/naming-services/internationalized-domain-names/index.html + * (.DE) Germany https://www.denic.de/en/know-how/idn-domains/idn-character-list/ + * (.DK) Danmark http://www.dk-hostmaster.dk/index.php?id=151 + * (.EE) Estonia https://www.iana.org/domains/idn-tables/tables/pl_et-pl_1.0.html + * (.ES) Spain https://www.nic.es/media/2008-05/1210147705287.pdf + * (.FI) Finland http://www.ficora.fi/en/index/palvelut/fiverkkotunnukset/aakkostenkaytto.html + * (.GR) Greece https://grweb.ics.forth.gr/CharacterTable1_en.jsp + * (.HR) Croatia https://www.dns.hr/en/portal/files/Odluka-1,2alfanum-dijak.pdf + * (.HU) Hungary http://www.domain.hu/domain/English/szabalyzat/szabalyzat.html + * (.IL) Israel http://www.isoc.org.il/domains/il-domain-rules.html + * (.INFO) International http://www.nic.info/info/idn + * (.IO) British Indian Ocean Territory http://www.nic.io/IO-IDN-Policy.pdf + * (.IR) Iran http://www.nic.ir/Allowable_Characters_dot-iran + * (.IS) Iceland https://www.isnic.is/en/domain/rules#2 + * (.KR) Korea http://www.iana.org/domains/idn-tables/tables/kr_ko-kr_1.0.html + * (.LI) Liechtenstein https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 + * (.LT) Lithuania http://www.domreg.lt/static/doc/public/idn_symbols-en.pdf + * (.MD) Moldova http://www.register.md/ + * (.MUSEUM) International http://www.iana.org/domains/idn-tables/tables/museum_latn_1.0.html + * (.NET) International http://www.verisign.com/information-services/naming-services/internationalized-domain-names/index.html + * (.NO) Norway http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.NU) Niue http://www.worldnames.net/ + * (.ORG) International http://www.pir.org/index.php?db=content/FAQs&tbl=FAQs_Registrant&id=2 + * (.PE) Peru https://www.nic.pe/nuevas_politicas_faq_2.php + * (.PL) Poland http://www.dns.pl/IDN/allowed_character_sets.pdf + * (.PR) Puerto Rico http://www.nic.pr/idn_rules.asp + * (.PT) Portugal https://online.dns.pt/dns_2008/do?com=DS;8216320233;111;+PAGE(4000058)+K-CAT-CODIGO(C.125)+RCNT(100); + * (.RU) Russia http://www.iana.org/domains/idn-tables/tables/ru_ru-ru_1.0.html + * (.SA) Saudi Arabia http://www.iana.org/domains/idn-tables/tables/sa_ar_1.0.html + * (.SE) Sweden http://www.iis.se/english/IDN_campaignsite.shtml?lang=en + * (.SH) Saint Helena http://www.nic.sh/SH-IDN-Policy.pdf + * (.SJ) Svalbard and Jan Mayen http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.TH) Thailand http://www.iana.org/domains/idn-tables/tables/th_th-th_1.0.html + * (.TM) Turkmenistan http://www.nic.tm/TM-IDN-Policy.pdf + * (.TR) Turkey https://www.nic.tr/index.php + * (.UA) Ukraine http://www.iana.org/domains/idn-tables/tables/ua_cyrl_1.2.html + * (.VE) Venice http://www.iana.org/domains/idn-tables/tables/ve_es_1.0.html + * (.VN) Vietnam http://www.vnnic.vn/english/5-6-300-2-2-04-20071115.htm#1.%20Introduction + * + * @var array> + */ + protected $validIdns = [ + 'AC' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'], + 'AR' => [1 => '/^[\x{002d}0-9a-zà-ãç-êìíñ-õü]{1,63}$/iu'], + 'AS' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźż]{1,63}$/iu'], + 'AT' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœšž]{1,63}$/iu'], + 'BIZ' => 'Hostname/Biz.php', + 'BR' => [1 => '/^[\x{002d}0-9a-zà-ãçéíó-õúü]{1,63}$/iu'], + 'BV' => [1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'], + 'CAT' => [1 => '/^[\x{002d}0-9a-z·àç-éíïòóúü]{1,63}$/iu'], + 'CH' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'], + 'CL' => [1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'], + 'CN' => 'Hostname/Cn.php', + 'COM' => 'Hostname/Com.php', + 'DE' => [1 => '/^[\x{002d}0-9a-záàăâåäãąāæćĉčċçďđéèĕêěëėęēğĝġģĥħíìĭîïĩįīıĵķĺľļłńňñņŋóòŏôöőõøōœĸŕřŗśŝšşßťţŧúùŭûůüűũųūŵýŷÿźžżðþ]{1,63}$/iu'], + 'DK' => [1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu'], + 'EE' => [1 => '/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu'], + 'ES' => [1 => '/^[\x{002d}0-9a-zàáçèéíïñòóúü·]{1,63}$/iu'], + 'EU' => [ + 1 => '/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋōŏőœŕŗřśŝšťŧũūŭůűųŵŷźżž]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zșț]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-zΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-zἀ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ὼώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶᾷῂῃῄῆῇῐ-ῒΐῖῗῠ-ῧῲῳῴῶῷ]{1,63}$/iu', + ], + 'FI' => [1 => '/^[\x{002d}0-9a-zäåö]{1,63}$/iu'], + 'GR' => [1 => '/^[\x{002d}0-9a-zΆΈΉΊΌΎ-ΡΣ-ώἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼῂῃῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲῳῴῶ-ῼ]{1,63}$/iu'], + 'HK' => 'Hostname/Cn.php', + 'HR' => [1 => '/^[\x{002d}0-9a-zžćčđš]{1,63}$/iu'], + 'HU' => [1 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu'], + 'IL' => [ + 1 => '/^[\x{002d}0-9\x{05D0}-\x{05EA}]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-z]{1,63}$/i', + ], + 'INFO' => [ + 1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu', + 4 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 5 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + ], + 'IO' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'], + 'IS' => [1 => '/^[\x{002d}0-9a-záéýúíóþæöð]{1,63}$/iu'], + 'IT' => [1 => '/^[\x{002d}0-9a-zàâäèéêëìîïòôöùûüæœçÿß-]{1,63}$/iu'], + 'JP' => 'Hostname/Jp.php', + 'KR' => [1 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu'], + 'LI' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'], + 'LT' => [1 => '/^[\x{002d}0-9ąčęėįšųūž]{1,63}$/iu'], + 'MD' => [1 => '/^[\x{002d}0-9ăâîşţ]{1,63}$/iu'], + 'MUSEUM' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćċčďđēėęěğġģħīįıķĺļľłńņňŋōőœŕŗřśşšţťŧūůűųŵŷźżžǎǐǒǔ\x{01E5}\x{01E7}\x{01E9}\x{01EF}ə\x{0292}ẁẃẅỳ]{1,63}$/iu'], + 'NET' => 'Hostname/Com.php', + 'NO' => [1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'], + 'NU' => 'Hostname/Com.php', + 'ORG' => [ + 1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 6 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 7 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + ], + 'PE' => [1 => '/^[\x{002d}0-9a-zñáéíóúü]{1,63}$/iu'], + 'PL' => [ + 1 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + 2 => '/^[\x{002d}а-ик-ш\x{0450}ѓѕјљњќџ]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu', + 4 => '/^[\x{002d}0-9а-яё\x{04C2}]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-zàáâèéêìíîòóôùúûċġħż]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-zàäåæéêòóôöøü]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-zàáâãçéêíòóôõúü]{1,63}$/iu', + 9 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu', + 10 => '/^[\x{002d}0-9a-záäéíóôúýčďĺľňŕšťž]{1,63}$/iu', + 11 => '/^[\x{002d}0-9a-zçë]{1,63}$/iu', + 12 => '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu', + 13 => '/^[\x{002d}0-9a-zćčđšž]{1,63}$/iu', + 14 => '/^[\x{002d}0-9a-zâçöûüğış]{1,63}$/iu', + 15 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 16 => '/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu', + 17 => '/^[\x{002d}0-9a-zĉĝĥĵŝŭ]{1,63}$/iu', + 18 => '/^[\x{002d}0-9a-zâäéëîô]{1,63}$/iu', + 19 => '/^[\x{002d}0-9a-zàáâäåæçèéêëìíîïðñòôöøùúûüýćčłńřśš]{1,63}$/iu', + 20 => '/^[\x{002d}0-9a-zäåæõöøüšž]{1,63}$/iu', + 21 => '/^[\x{002d}0-9a-zàáçèéìíòóùú]{1,63}$/iu', + 22 => '/^[\x{002d}0-9a-zàáéíóöúüőű]{1,63}$/iu', + 23 => '/^[\x{002d}0-9ΐά-ώ]{1,63}$/iu', + 24 => '/^[\x{002d}0-9a-zàáâåæçèéêëðóôöøüþœ]{1,63}$/iu', + 25 => '/^[\x{002d}0-9a-záäéíóöúüýčďěňřšťůž]{1,63}$/iu', + 26 => '/^[\x{002d}0-9a-z·àçèéíïòóúü]{1,63}$/iu', + 27 => '/^[\x{002d}0-9а-ъьюя\x{0450}\x{045D}]{1,63}$/iu', + 28 => '/^[\x{002d}0-9а-яёіў]{1,63}$/iu', + 29 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 30 => '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu', + 31 => '/^[\x{002d}0-9a-zàâæçèéêëîïñôùûüÿœ]{1,63}$/iu', + 32 => '/^[\x{002d}0-9а-щъыьэюяёєіїґ]{1,63}$/iu', + 33 => '/^[\x{002d}0-9א-ת]{1,63}$/iu', + ], + 'PR' => [1 => '/^[\x{002d}0-9a-záéíóúñäëïüöâêîôûàèùæçœãõ]{1,63}$/iu'], + 'PT' => [1 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu'], + 'RS' => [1 => '/^[\x{002d}0-9a-zßáâäçéëíîóôöúüýăąćčďđęěĺľłńňőŕřśşšţťůűźżž]{1,63}$/iu'], + 'RU' => [1 => '/^[\x{002d}0-9а-яё]{1,63}$/iu'], + 'SA' => [1 => '/^[\x{002d}.0-9\x{0621}-\x{063A}\x{0641}-\x{064A}\x{0660}-\x{0669}]{1,63}$/iu'], + 'SE' => [1 => '/^[\x{002d}0-9a-zäåéöü]{1,63}$/iu'], + 'SH' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'], + 'SI' => [ + 1 => '/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋōŏőœŕŗřśŝšťŧũūŭůűųŵŷźżž]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zșț]{1,63}$/iu', + ], + 'SJ' => [1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'], + 'TH' => [1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'], + 'TM' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'], + 'TW' => 'Hostname/Cn.php', + 'TR' => [1 => '/^[\x{002d}0-9a-zğıüşöç]{1,63}$/iu'], + 'UA' => [1 => '/^[\x{002d}0-9a-zабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџґӂʼ]{1,63}$/iu'], + 'VE' => [1 => '/^[\x{002d}0-9a-záéíóúüñ]{1,63}$/iu'], + 'VN' => [1 => '/^[ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯư\x{1EA0}-\x{1EF9}]{1,63}$/iu'], + 'мон' => [1 => '/^[\x{002d}0-9\x{0430}-\x{044F}]{1,63}$/iu'], + 'срб' => [1 => '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu'], + 'сайт' => [1 => '/^[\x{002d}0-9а-яёіїѝйўґг]{1,63}$/iu'], + 'онлайн' => [1 => '/^[\x{002d}0-9а-яёіїѝйўґг]{1,63}$/iu'], + '中国' => 'Hostname/Cn.php', + '中國' => 'Hostname/Cn.php', + 'ලංකා' => [1 => '/^[\x{0d80}-\x{0dff}]{1,63}$/iu'], + '香港' => 'Hostname/Cn.php', + '台湾' => 'Hostname/Cn.php', + '台灣' => 'Hostname/Cn.php', + 'امارات' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + 'الاردن' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + 'السعودية' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + 'ไทย' => [1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'], + 'рф' => [1 => '/^[\x{002d}0-9а-яё]{1,63}$/iu'], + 'تونس' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + 'مصر' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + 'இலங்கை' => [1 => '/^[\x{0b80}-\x{0bff}]{1,63}$/iu'], + 'فلسطين' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + 'شبكة' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'], + ]; + + /** @var array> */ + protected $idnLength = [ + 'BIZ' => [5 => 17, 11 => 15, 12 => 20], + 'CN' => [1 => 20], + 'COM' => [3 => 17, 5 => 20], + 'HK' => [1 => 15], + 'INFO' => [4 => 17], + 'KR' => [1 => 17], + 'NET' => [3 => 17, 5 => 20], + 'ORG' => [6 => 17], + 'TW' => [1 => 20], + 'امارات' => [1 => 30], + 'الاردن' => [1 => 30], + 'السعودية' => [1 => 30], + 'تونس' => [1 => 30], + 'مصر' => [1 => 30], + 'فلسطين' => [1 => 30], + 'شبكة' => [1 => 30], + '中国' => [1 => 20], + '中國' => [1 => 20], + '香港' => [1 => 20], + '台湾' => [1 => 20], + '台灣' => [1 => 20], + ]; + + /** @var null|false|string */ + protected $tld; + + /** + * Options for the hostname validator + * + * @var Options + */ + protected $options = [ + 'allow' => self::ALLOW_DNS, // Allow these hostnames + 'useIdnCheck' => true, // Check IDN domains + 'useTldCheck' => true, // Check TLD elements + 'ipValidator' => null, // IP validator to use + ]; + + // phpcs:disable Squiz.Commenting.FunctionComment.ExtraParamComment + + /** + * Sets validator options. + * + * @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm Technical Specifications for ccTLDs + * + * Options Parameters should be passed as an array in the following format: + * $options = [ + * 'allow' => ALLOW_DNS, // OPTIONAL Set what types of hostname to allow (default ALLOW_DNS) + * 'useIdnCheck' => true, // OPTIONAL Set whether IDN domains are validated (default true) + * 'useTldCheck' => true, // Set whether the TLD element of a hostname is validated (default true) + * 'ipValidator' => null, // An IP validator instance or null @link Ip + * ]; + * + * For backwards compatibility, options can also be passed as variables in the order stated above. + * + * @param Options $options OPTIONAL Array of validator options; see Hostname::$options + */ + public function __construct($options = []) + { + if (! is_array($options)) { + $options = func_get_args(); + $temp['allow'] = array_shift($options); + if (! empty($options)) { + $temp['useIdnCheck'] = array_shift($options); + } + + if (! empty($options)) { + $temp['useTldCheck'] = array_shift($options); + } + + if (! empty($options)) { + $temp['ipValidator'] = array_shift($options); + } + + $options = $temp; + } + + if (! array_key_exists('ipValidator', $options)) { + $options['ipValidator'] = null; + } + + parent::__construct($options); + } + + /** + * Returns the set ip validator + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @return Ip + */ + public function getIpValidator() + { + return $this->options['ipValidator']; + } + + /** + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @param Ip $ipValidator OPTIONAL + * @return self + */ + public function setIpValidator(?Ip $ipValidator = null) + { + if ($ipValidator === null) { + $ipValidator = new Ip(); + } + + $this->options['ipValidator'] = $ipValidator; + return $this; + } + + /** + * Returns the allow option + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @return int + */ + public function getAllow() + { + return $this->options['allow']; + } + + /** + * Sets the allow option + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @param int $allow + * @return $this Provides a fluent interface + */ + public function setAllow($allow) + { + $this->options['allow'] = $allow; + return $this; + } + + /** + * Returns the set idn option + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getIdnCheck() + { + return $this->options['useIdnCheck']; + } + + /** + * Set whether IDN domains are validated + * + * This only applies when DNS hostnames are validated + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @param bool $useIdnCheck Set to true to validate IDN domains + * @return $this + */ + public function useIdnCheck($useIdnCheck) + { + $this->options['useIdnCheck'] = (bool) $useIdnCheck; + return $this; + } + + /** + * Returns the set tld option + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @return bool + */ + public function getTldCheck() + { + return $this->options['useTldCheck']; + } + + /** + * Set whether the TLD element of a hostname is validated + * + * This only applies when DNS hostnames are validated + * + * @deprecated Since 2.61.0 all options getters and setters will be removed in 3.0 + * + * @param bool $useTldCheck Set to true to validate TLD elements + * @return $this + */ + public function useTldCheck($useTldCheck) + { + $this->options['useTldCheck'] = (bool) $useTldCheck; + return $this; + } + + /** + * Defined by Interface + * + * Returns true if and only if the $value is a valid hostname with respect to the current allow option + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + // Check input against IP address schema + if ( + ((preg_match('/^[0-9.]*$/', $value) && str_contains($value, '.')) + || (preg_match('/^[0-9a-f:.]*$/i', $value) && str_contains($value, ':'))) + && $this->getIpValidator()->setTranslator($this->getTranslator())->isValid($value) + ) { + if (! ($this->getAllow() & self::ALLOW_IP)) { + $this->error(self::IP_ADDRESS_NOT_ALLOWED); + return false; + } + + return true; + } + + // Handle Regex compilation failure that may happen on .biz domain with has @ character, eg: tapi4457@hsoqvf.biz + // Technically, hostname with '@' character is invalid, so mark as invalid immediately + // @see https://github.com/laminas/laminas-validator/issues/8 + if (str_contains($value, '@')) { + $this->error(self::INVALID_HOSTNAME); + return false; + } + + // Local hostnames are allowed to be partial (ending '.') + if ($this->getAllow() & self::ALLOW_LOCAL) { + if (str_ends_with($value, '.')) { + $value = substr($value, 0, -1); + if (str_ends_with($value, '.')) { + // Empty hostnames (ending '..') are not allowed + $this->error(self::INVALID_LOCAL_NAME); + return false; + } + } + } + + $domainParts = explode('.', $value); + + // Prevent partial IP V4 addresses (ending '.') + if ( + count($domainParts) === 4 && preg_match('/^[0-9.a-e:.]*$/i', $value) + && $this->getIpValidator()->setTranslator($this->getTranslator())->isValid($value) + ) { + $this->error(self::INVALID_LOCAL_NAME); + } + + $utf8StrWrapper = StringUtils::getWrapper('UTF-8'); + + // Check input against DNS hostname schema + if ( + count($domainParts) > 1 + && $utf8StrWrapper->strlen($value) >= 4 + && $utf8StrWrapper->strlen($value) <= 254 + ) { + $status = false; + + do { + // First check TLD + $matches = []; + if ( + preg_match('/([^.]{2,63})$/u', end($domainParts), $matches) + || (array_key_exists(end($domainParts), $this->validIdns)) + ) { + reset($domainParts); + + // Hostname characters are: *(label dot)(label dot label); max 254 chars + // label: id-prefix [*ldh{61} id-prefix]; max 63 chars + // id-prefix: alpha / digit + // ldh: alpha / digit / dash + + $this->tld = $matches[1]; + // Decode Punycode TLD to IDN + if (str_starts_with($this->tld, 'xn--')) { + $this->tld = $this->decodePunycode(substr($this->tld, 4)); + if ($this->tld === false) { + return false; + } + } else { + $this->tld = strtoupper($this->tld); + } + + // Match TLD against known list + $removedTld = false; + if ($this->getTldCheck()) { + if ( + ! in_array(strtolower($this->tld), $this->validTlds) + && ! in_array($this->tld, $this->validTlds) + ) { + $this->error(self::UNKNOWN_TLD); + $status = false; + break; + } + // We have already validated that the TLD is fine. We don't want it to go through the below + // checks as new UTF-8 TLDs will incorrectly fail if there is no IDN regex for it. + array_pop($domainParts); + $removedTld = true; + } + + /** + * Match against IDN hostnames + * Note: Keep label regex short to avoid issues with long patterns when matching IDN hostnames + * + * @see Hostname\Interface + */ + $regexChars = [0 => '/^[a-z0-9\x2d]{1,63}$/i']; + if ($this->getIdnCheck() && isset($this->validIdns[$this->tld])) { + if (is_string($this->validIdns[$this->tld])) { + $regexChars += include __DIR__ . '/' . $this->validIdns[$this->tld]; + } else { + $regexChars += $this->validIdns[$this->tld]; + } + } + + // Check each hostname part + $check = 0; + $lastDomainPart = end($domainParts); + if (! $removedTld) { + $lastDomainPart = prev($domainParts); + } + foreach ($domainParts as $domainPart) { + // Decode Punycode domain names to IDN + if (str_starts_with($domainPart, 'xn--')) { + $domainPart = $this->decodePunycode(substr($domainPart, 4)); + if ($domainPart === false) { + return false; + } + } + + // Skip following checks if domain part is empty, as it definitely is not a valid hostname then + if ($domainPart === '') { + $this->error(self::INVALID_HOSTNAME); + $status = false; + break 2; + } + + // Check dash (-) does not start, end or appear in 3rd and 4th positions + if ( + $utf8StrWrapper->strpos($domainPart, '-') === 0 + || ($utf8StrWrapper->strlen($domainPart) > 2 + && $utf8StrWrapper->strpos($domainPart, '-', 2) === 2 + && $utf8StrWrapper->strpos($domainPart, '-', 3) === 3 + ) + || $utf8StrWrapper->substr($domainPart, -1) === '-' + ) { + $this->error(self::INVALID_DASH); + $status = false; + break 2; + } + + // Check each domain part + $checked = false; + $isSubDomain = $domainPart !== $lastDomainPart; + $partRegexChars = $isSubDomain ? ['/^[a-z0-9_\x2d]{1,63}$/i'] + $regexChars : $regexChars; + foreach ($partRegexChars as $regexKey => $regexChar) { + $status = preg_match($regexChar, $domainPart); + if ($status > 0) { + $length = 63; + if ( + array_key_exists($this->tld, $this->idnLength) + && array_key_exists($regexKey, $this->idnLength[$this->tld]) + ) { + $length = $this->idnLength[$this->tld]; + } + + if ($utf8StrWrapper->strlen($domainPart) > $length) { + $this->error(self::INVALID_HOSTNAME); + $status = false; + } else { + $checked = true; + break; + } + } + } + + if ($checked) { + ++$check; + } + } + + // If one of the labels doesn't match, the hostname is invalid + if ($check !== count($domainParts)) { + $this->error(self::INVALID_HOSTNAME_SCHEMA); + $status = false; + } + } else { + // Hostname not long enough + $this->error(self::UNDECIPHERABLE_TLD); + $status = false; + } + } while (false); + + // If the input passes as an Internet domain name, and domain names are allowed, then the hostname + // passes validation + if ($status && ($this->getAllow() & self::ALLOW_DNS)) { + return true; + } + } elseif ($this->getAllow() & self::ALLOW_DNS) { + $this->error(self::INVALID_HOSTNAME); + } + + // Check for URI Syntax (RFC3986) + if ($this->getAllow() & self::ALLOW_URI) { + if (preg_match("/^([a-zA-Z0-9-._~!$&\'()*+,;=]|%[[:xdigit:]]{2}){1,254}$/i", $value)) { + return true; + } + + $this->error(self::INVALID_URI); + } + + // Check input against local network name schema; last chance to pass validation + $regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}[\x2e]{0,1}){1,254}$/'; + $status = preg_match($regexLocal, $value); + + // If the input passes as a local network name, and local network names are allowed, then the + // hostname passes validation + $allowLocal = $this->getAllow() & self::ALLOW_LOCAL; + if ($status && $allowLocal) { + return true; + } + + // If the input does not pass as a local network name, add a message + if (! $status) { + $this->error(self::INVALID_LOCAL_NAME); + } + + // If local network names are not allowed, add a message + if ($status && ! $allowLocal) { + $this->error(self::LOCAL_NAME_NOT_ALLOWED); + } + + return false; + } + + /** + * Decodes a punycode encoded string to it's original utf8 string + * Returns false in case of a decoding failure. + * + * @param string $encoded Punycode encoded string to decode + * @return string|false + */ + protected function decodePunycode($encoded) + { + if (! preg_match('/^[a-z0-9-]+$/i', $encoded)) { + // no punycode encoded string + $this->error(self::CANNOT_DECODE_PUNYCODE); + return false; + } + + $decoded = []; + $separator = strrpos($encoded, '-'); + if ($separator > 0) { + for ($x = 0; $x < $separator; ++$x) { + // prepare decoding matrix + $decoded[] = ord($encoded[$x]); + } + } + + $lengthd = count($decoded); + $lengthe = strlen($encoded); + + // decoding + $init = true; + $base = 72; + $index = 0; + $char = 0x80; + + for ($indexe = $separator !== false ? $separator + 1 : 0; $indexe < $lengthe; ++$lengthd) { + for ($oldIndex = $index, $pos = 1, $key = 36; 1; $key += 36) { + if (! isset($encoded[$indexe])) { + break 2; + } + + $hex = ord($encoded[$indexe++]); + $digit = $hex - 48 < 10 ? $hex - 22 + : ($hex - 65 < 26 ? $hex - 65 + : ($hex - 97 < 26 ? $hex - 97 + : 36)); + + $index += $digit * $pos; + $tag = $key <= $base ? 1 : ($key >= $base + 26 ? 26 : $key - $base); + if ($digit < $tag) { + break; + } + + $pos = (int) ($pos * (36 - $tag)); + } + + $delta = intval($init ? ($index - $oldIndex) / 700 : ($index - $oldIndex) / 2); + $delta += intval($delta / ($lengthd + 1)); + for ($key = 0; $delta > 910 / 2; $key += 36) { + $delta = intval($delta / 35); + } + + $base = intval($key + 36 * $delta / ($delta + 38)); + $init = false; + $char += (int) ($index / ($lengthd + 1)); + $index %= $lengthd + 1; + if ($lengthd > 0) { + for ($i = $lengthd; $i > $index; $i--) { + $decoded[$i] = $decoded[$i - 1]; + } + } + + $decoded[$index++] = $char; + } + + // convert decoded ucs4 to utf8 string + foreach ($decoded as $key => $value) { + if ($value < 128) { + $decoded[$key] = chr($value); + } elseif ($value < 1 << 11) { + $decoded[$key] = chr(192 + ($value >> 6)); + $decoded[$key] .= chr(128 + ($value & 63)); + } elseif ($value < 1 << 16) { + $decoded[$key] = chr(224 + ($value >> 12)); + $decoded[$key] .= chr(128 + (($value >> 6) & 63)); + $decoded[$key] .= chr(128 + ($value & 63)); + } elseif ($value < 1 << 21) { + $decoded[$key] = chr(240 + ($value >> 18)); + $decoded[$key] .= chr(128 + (($value >> 12) & 63)); + $decoded[$key] .= chr(128 + (($value >> 6) & 63)); + $decoded[$key] .= chr(128 + ($value & 63)); + } else { + $this->error(self::CANNOT_DECODE_PUNYCODE); + return false; + } + } + + return implode($decoded); + } +} diff --git a/vendor/laminas/laminas-validator/src/Hostname/Biz.php b/vendor/laminas/laminas-validator/src/Hostname/Biz.php new file mode 100644 index 00000000..f852cf1c --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Hostname/Biz.php @@ -0,0 +1,2897 @@ + '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu', + 5 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 6 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu', + 9 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 10 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu', + 11 => '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}\x{30A1}-\x{30F6}\x{30FC}' + . '\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' + . '\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}' + . '\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}' + . '\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}' + . '\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}' + . '\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}' + . '\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}' + . '\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}' + . '\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}' + . '\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}' + . '\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}' + . '\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}' + . '\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}' + . '\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}' + . '\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}' + . '\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}' + . '\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}' + . '\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}' + . '\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}' + . '\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}' + . '\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}' + . '\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}' + . '\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}' + . '\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}' + . '\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}' + . '\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}' + . '\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}' + . '\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}' + . '\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}' + . '\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}' + . '\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}' + . '\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}' + . '\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}' + . '\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}' + . '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' + . '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}' + . '\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}' + . '\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}' + . '\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}' + . '\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}' + . '\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}' + . '\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}' + . '\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}' + . '\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}' + . '\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}' + . '\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}' + . '\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}' + . '\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}' + . '\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}' + . '\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}' + . '\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}' + . '\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}' + . '\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}' + . '\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}' + . '\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}' + . '\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}' + . '\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}' + . '\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}' + . '\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}' + . '\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}' + . '\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}' + . '\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}' + . '\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}' + . '\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}' + . '\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}' + . '\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}' + . '\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}' + . '\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}' + . '\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}' + . '\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}' + . '\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}' + . '\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}' + . '\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}' + . '\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}' + . '\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}' + . '\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}' + . '\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}' + . '\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}' + . '\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}' + . '\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}' + . '\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}' + . '\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}' + . '\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}' + . '\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}' + . '\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}' + . '\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}' + . '\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}' + . '\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}' + . '\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}' + . '\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}' + . '\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}' + . '\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}' + . '\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}' + . '\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}' + . '\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}' + . '\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}' + . '\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}' + . '\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}' + . '\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}' + . '\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}' + . '\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}' + . '\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}' + . '\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}' + . '\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}' + . '\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}' + . '\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}' + . '\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}' + . '\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}' + . '\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}' + . '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}' + . '\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}' + . '\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}' + . '\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}' + . '\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}' + . '\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}' + . '\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}' + . '\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}' + . '\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}' + . '\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}' + . '\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}' + . '\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}' + . '\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}' + . '\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}' + . '\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}' + . '\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}' + . '\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}' + . '\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}' + . '\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}' + . '\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}' + . '\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}' + . '\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}' + . '\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}' + . '\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}' + . '\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}' + . '\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}' + . '\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}' + . '\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}' + . '\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}' + . '\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}' + . '\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}' + . '\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}' + . '\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}' + . '\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}' + . '\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}' + . '\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}' + . '\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}' + . '\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}' + . '\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}' + . '\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}' + . '\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}' + . '\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}' + . '\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}' + . '\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}' + . '\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}' + . '\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}' + . '\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}' + . '\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}' + . '\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}' + . '\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}' + . '\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}' + . '\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}' + . '\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}' + . '\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}' + . '\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}' + . '\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}' + . '\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}' + . '\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}' + . '\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}' + . '\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}' + . '\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}' + . '\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}' + . '\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}' + . '\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}' + . '\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}' + . '\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}' + . '\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}' + . '\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}' + . '\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}' + . '\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}' + . '\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}' + . '\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}' + . '\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}' + . '\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}' + . '\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}' + . '\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}' + . '\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}' + . '\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}' + . '\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}' + . '\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}' + . '\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}' + . '\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}' + . '\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}' + . '\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}' + . '\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}' + . '\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}' + . '\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}' + . '\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' + . '\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}' + . '\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}' + . '\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}' + . '\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}' + . '\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}' + . '\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}' + . '\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}' + . '\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}' + . '\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}' + . '\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}' + . '\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}' + . '\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}' + . '\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}' + . '\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}' + . '\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}' + . '\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}' + . '\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}' + . '\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}' + . '\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}' + . '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}' + . '\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}' + . '\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}' + . '\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}' + . '\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}' + . '\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}' + . '\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}' + . '\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}' + . '\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}' + . '\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}' + . '\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}' + . '\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}' + . '\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}' + . '\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}' + . '\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}' + . '\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}' + . '\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}' + . '\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}' + . '\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}' + . '\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}' + . '\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}' + . '\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}' + . '\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}' + . '\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}' + . '\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}' + . '\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}' + . '\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}' + . '\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}' + . '\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}' + . '\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}' + . '\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}' + . '\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}' + . '\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}' + . '\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}' + . '\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}' + . '\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}' + . '\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' + . '\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}' + . '\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}' + . '\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}' + . '\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}' + . '\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}' + . '\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}' + . '\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}' + . '\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}' + . '\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}' + . '\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}' + . '\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}' + . '\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}' + . '\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}' + . '\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}' + . '\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}' + . '\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}' + . '\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}' + . '\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}' + . '\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}' + . '\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}' + . '\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}' + . '\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}' + . '\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}' + . '\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}' + . '\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}' + . '\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}' + . '\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}' + . '\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}' + . '\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}' + . '\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}' + . '\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}' + . '\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}' + . '\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}' + . '\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}' + . '\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}' + . '\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}' + . '\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}' + . '\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}' + . '\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}' + . '\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}' + . '\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}' + . '\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}' + . '\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}' + . '\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}' + . '\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}' + . '\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}' + . '\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}' + . '\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}' + . '\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}' + . '\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}' + . '\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}' + . '\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}' + . '\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}' + . '\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}' + . '\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}' + . '\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}' + . '\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}' + . '\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}' + . '\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}' + . '\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}' + . '\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}' + . '\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}' + . '\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}' + . '\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}' + . '\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}' + . '\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}' + . '\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}' + . '\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}' + . '\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}' + . '\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}' + . '\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}' + . '\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}' + . '\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}' + . '\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}' + . '\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}' + . '\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}' + . '\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}' + . '\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}' + . '\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}' + . '\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}' + . '\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}' + . '\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}' + . '\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}' + . '\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}' + . '\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}' + . '\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}' + . '\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}' + . '\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}' + . '\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}' + . '\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}' + . '\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}' + . '\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}' + . '\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}' + . '\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}' + . '\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}' + . '\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}' + . '\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}' + . '\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}' + . '\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}' + . '\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}' + . '\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}' + . '\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}' + . '\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}' + . '\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}' + . '\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}' + . '\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}' + . '\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}' + . '\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}' + . '\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}' + . '\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}' + . '\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}' + . '\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}' + . '\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}' + . '\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}' + . '\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}' + . '\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}' + . '\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}' + . '\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}' + . '\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}' + . '\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}' + . '\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}' + . '\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}' + . '\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}' + . '\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}' + . '\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}' + . '\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}' + . '\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}' + . '\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}' + . '\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}' + . '\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}' + . '\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}' + . '\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}' + . '\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}' + . '\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}' + . '\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}' + . '\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}' + . '\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}' + . '\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}' + . '\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}' + . '\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}' + . '\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}' + . '\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}' + . '\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}' + . '\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}' + . '\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}' + . '\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}' + . '\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}' + . '\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}' + . '\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}' + . '\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}' + . '\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}' + . '\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}' + . '\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}' + . '\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}' + . '\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}' + . '\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}' + . '\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}' + . '\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' + . '\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}' + . '\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}' + . '\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}' + . '\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}' + . '\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}' + . '\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}' + . '\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}' + . '\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}' + . '\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}' + . '\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}' + . '\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}' + . '\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}' + . '\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}' + . '\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}' + . '\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}' + . '\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}' + . '\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}' + . '\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}' + . '\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}' + . '\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}' + . '\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}' + . '\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}' + . '\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}' + . '\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}' + . '\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}' + . '\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}' + . '\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}' + . '\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}' + . '\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}' + . '\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}' + . '\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}' + . '\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}' + . '\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}' + . '\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}' + . '\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}' + . '\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}' + . '\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}' + . '\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}' + . '\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}' + . '\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}' + . '\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}' + . '\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}' + . '\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}' + . '\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}' + . '\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}' + . '\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}' + . '\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}' + . '\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}' + . '\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}' + . '\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}' + . '\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}' + . '\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}' + . '\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}' + . '\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}' + . '\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}' + . '\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}' + . '\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}' + . '\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}' + . '\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}' + . '\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}' + . '\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}' + . '\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}' + . '\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}' + . '\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}' + . '\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}' + . '\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}' + . '\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}' + . '\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}' + . '\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}' + . '\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}' + . '\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}' + . '\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}' + . '\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}' + . '\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}' + . '\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}' + . '\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}' + . '\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}' + . '\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}' + . '\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}' + . '\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}' + . '\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}' + . '\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}' + . '\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}' + . '\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}' + . '\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}' + . '\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}' + . '\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}' + . '\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}' + . '\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}' + . '\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}' + . '\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}' + . '\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}' + . '\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}' + . '\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}' + . '\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}' + . '\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}' + . '\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}' + . '\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}' + . '\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}' + . '\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}' + . '\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}' + . '\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}' + . '\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}' + . '\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}' + . '\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}' + . '\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}' + . '\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}' + . '\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}' + . '\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}' + . '\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}' + . '\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}' + . '\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}' + . '\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}' + . '\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}' + . '\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}' + . '\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}' + . '\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}' + . '\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}' + . '\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}' + . '\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}' + . '\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}' + . '\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}' + . '\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}' + . '\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}' + . '\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}' + . '\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}' + . '\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}' + . '\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}' + . '\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}' + . '\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}' + . '\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}' + . '\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}' + . '\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}' + . '\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}' + . '\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}' + . '\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}' + . '\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}' + . '\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}' + . '\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}' + . '\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}' + . '\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}' + . '\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}' + . '\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}' + . '\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}' + . '\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}' + . '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}' + . '\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}' + . '\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}' + . '\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}' + . '\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}' + . '\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}' + . '\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}' + . '\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}' + . '\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}' + . '\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}' + . '\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}' + . '\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}' + . '\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}' + . '\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}' + . '\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}' + . '\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}' + . '\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}' + . '\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}' + . '\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}' + . '\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}' + . '\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}' + . '\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}' + . '\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}' + . '\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}' + . '\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}' + . '\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}' + . '\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}' + . '\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}' + . '\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}' + . '\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}' + . '\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}' + . '\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}' + . '\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}' + . '\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}' + . '\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}' + . '\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}' + . '\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}' + . '\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}' + . '\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}' + . '\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}' + . '\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}' + . '\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}' + . '\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}' + . '\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}' + . '\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}' + . '\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}' + . '\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}' + . '\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}' + . '\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}' + . '\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}' + . '\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}' + . '\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}' + . '\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}' + . '\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}' + . '\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}' + . '\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}' + . '\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}' + . '\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}' + . '\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}' + . '\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}' + . '\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}' + . '\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}' + . '\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}' + . '\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}' + . '\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}' + . '\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}' + . '\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}' + . '\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}' + . '\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}' + . '\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}' + . '\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}' + . '\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}' + . '\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}' + . '\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}' + . '\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}' + . '\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}' + . '\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}' + . '\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}' + . '\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}' + . '\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}' + . '\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}' + . '\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}' + . '\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}' + . '\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}' + . '\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}' + . '\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}' + . '\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}' + . '\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}' + . '\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}' + . '\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}' + . '\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}' + . '\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}' + . '\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}' + . '\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}' + . '\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}' + . '\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}' + . '\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}' + . '\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}' + . '\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}' + . '\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}' + . '\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}' + . '\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}' + . '\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}' + . '\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}' + . '\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}' + . '\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}' + . '\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}' + . '\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}' + . '\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}' + . '\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}' + . '\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}' + . '\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}' + . '\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}' + . '\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}' + . '\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}' + . '\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}' + . '\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}' + . '\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}' + . '\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}' + . '\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}' + . '\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}' + . '\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}' + . '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}' + . '\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}' + . '\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}' + . '\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}' + . '\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}' + . '\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}' + . '\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}' + . '\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}' + . '\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}' + . '\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}' + . '\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}' + . '\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' + . '\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}' + . '\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}' + . '\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}' + . '\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}' + . '\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}' + . '\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}' + . '\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}' + . '\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}' + . '\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}' + . '\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}' + . '\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}' + . '\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}' + . '\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}' + . '\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}' + . '\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}' + . '\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}' + . '\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu', + 12 => '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' + . '\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}' + . '\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}' + . '\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}' + . '\x{49B6}\x{49B7}\x{4C77}\x{4C9F}\x{4CA0}\x{4CA1}\x{4CA2}\x{4CA3}\x{4D13}' + . '\x{4D14}\x{4D15}\x{4D16}\x{4D17}\x{4D18}\x{4D19}\x{4DAE}\x{4E00}\x{4E01}' + . '\x{4E02}\x{4E03}\x{4E04}\x{4E05}\x{4E06}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' + . '\x{4E0B}\x{4E0C}\x{4E0D}\x{4E0E}\x{4E0F}\x{4E10}\x{4E11}\x{4E13}\x{4E14}' + . '\x{4E15}\x{4E16}\x{4E17}\x{4E18}\x{4E19}\x{4E1A}\x{4E1B}\x{4E1C}\x{4E1D}' + . '\x{4E1E}\x{4E1F}\x{4E20}\x{4E21}\x{4E22}\x{4E23}\x{4E24}\x{4E25}\x{4E26}' + . '\x{4E27}\x{4E28}\x{4E2A}\x{4E2B}\x{4E2C}\x{4E2D}\x{4E2E}\x{4E2F}\x{4E30}' + . '\x{4E31}\x{4E32}\x{4E33}\x{4E34}\x{4E35}\x{4E36}\x{4E37}\x{4E38}\x{4E39}' + . '\x{4E3A}\x{4E3B}\x{4E3C}\x{4E3D}\x{4E3E}\x{4E3F}\x{4E40}\x{4E41}\x{4E42}' + . '\x{4E43}\x{4E44}\x{4E45}\x{4E46}\x{4E47}\x{4E48}\x{4E49}\x{4E4A}\x{4E4B}' + . '\x{4E4C}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E50}\x{4E51}\x{4E52}\x{4E53}\x{4E54}' + . '\x{4E56}\x{4E57}\x{4E58}\x{4E59}\x{4E5A}\x{4E5B}\x{4E5C}\x{4E5D}\x{4E5E}' + . '\x{4E5F}\x{4E60}\x{4E61}\x{4E62}\x{4E63}\x{4E64}\x{4E65}\x{4E66}\x{4E67}' + . '\x{4E69}\x{4E6A}\x{4E6B}\x{4E6C}\x{4E6D}\x{4E6E}\x{4E6F}\x{4E70}\x{4E71}' + . '\x{4E72}\x{4E73}\x{4E74}\x{4E75}\x{4E76}\x{4E77}\x{4E78}\x{4E7A}\x{4E7B}' + . '\x{4E7C}\x{4E7D}\x{4E7E}\x{4E7F}\x{4E80}\x{4E81}\x{4E82}\x{4E83}\x{4E84}' + . '\x{4E85}\x{4E86}\x{4E87}\x{4E88}\x{4E89}\x{4E8B}\x{4E8C}\x{4E8D}\x{4E8E}' + . '\x{4E8F}\x{4E90}\x{4E91}\x{4E92}\x{4E93}\x{4E94}\x{4E95}\x{4E97}\x{4E98}' + . '\x{4E99}\x{4E9A}\x{4E9B}\x{4E9C}\x{4E9D}\x{4E9E}\x{4E9F}\x{4EA0}\x{4EA1}' + . '\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA7}\x{4EA8}\x{4EA9}\x{4EAA}\x{4EAB}' + . '\x{4EAC}\x{4EAD}\x{4EAE}\x{4EAF}\x{4EB0}\x{4EB1}\x{4EB2}\x{4EB3}\x{4EB4}' + . '\x{4EB5}\x{4EB6}\x{4EB7}\x{4EB8}\x{4EB9}\x{4EBA}\x{4EBB}\x{4EBD}\x{4EBE}' + . '\x{4EBF}\x{4EC0}\x{4EC1}\x{4EC2}\x{4EC3}\x{4EC4}\x{4EC5}\x{4EC6}\x{4EC7}' + . '\x{4EC8}\x{4EC9}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED0}\x{4ED1}' + . '\x{4ED2}\x{4ED3}\x{4ED4}\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDA}' + . '\x{4EDB}\x{4EDC}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE0}\x{4EE1}\x{4EE2}\x{4EE3}' + . '\x{4EE4}\x{4EE5}\x{4EE6}\x{4EE8}\x{4EE9}\x{4EEA}\x{4EEB}\x{4EEC}\x{4EEF}' + . '\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EFB}' + . '\x{4EFD}\x{4EFF}\x{4F00}\x{4F01}\x{4F02}\x{4F03}\x{4F04}\x{4F05}\x{4F06}' + . '\x{4F08}\x{4F09}\x{4F0A}\x{4F0B}\x{4F0C}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}' + . '\x{4F11}\x{4F12}\x{4F13}\x{4F14}\x{4F15}\x{4F17}\x{4F18}\x{4F19}\x{4F1A}' + . '\x{4F1B}\x{4F1C}\x{4F1D}\x{4F1E}\x{4F1F}\x{4F20}\x{4F21}\x{4F22}\x{4F23}' + . '\x{4F24}\x{4F25}\x{4F26}\x{4F27}\x{4F29}\x{4F2A}\x{4F2B}\x{4F2C}\x{4F2D}' + . '\x{4F2E}\x{4F2F}\x{4F30}\x{4F32}\x{4F33}\x{4F34}\x{4F36}\x{4F38}\x{4F39}' + . '\x{4F3A}\x{4F3B}\x{4F3C}\x{4F3D}\x{4F3E}\x{4F3F}\x{4F41}\x{4F42}\x{4F43}' + . '\x{4F45}\x{4F46}\x{4F47}\x{4F48}\x{4F49}\x{4F4A}\x{4F4B}\x{4F4C}\x{4F4D}' + . '\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}\x{4F52}\x{4F53}\x{4F54}\x{4F55}\x{4F56}' + . '\x{4F57}\x{4F58}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}\x{4F5F}' + . '\x{4F60}\x{4F61}\x{4F62}\x{4F63}\x{4F64}\x{4F65}\x{4F66}\x{4F67}\x{4F68}' + . '\x{4F69}\x{4F6A}\x{4F6B}\x{4F6C}\x{4F6D}\x{4F6E}\x{4F6F}\x{4F70}\x{4F72}' + . '\x{4F73}\x{4F74}\x{4F75}\x{4F76}\x{4F77}\x{4F78}\x{4F79}\x{4F7A}\x{4F7B}' + . '\x{4F7C}\x{4F7D}\x{4F7E}\x{4F7F}\x{4F80}\x{4F81}\x{4F82}\x{4F83}\x{4F84}' + . '\x{4F85}\x{4F86}\x{4F87}\x{4F88}\x{4F89}\x{4F8A}\x{4F8B}\x{4F8D}\x{4F8F}' + . '\x{4F90}\x{4F91}\x{4F92}\x{4F93}\x{4F94}\x{4F95}\x{4F96}\x{4F97}\x{4F98}' + . '\x{4F99}\x{4F9A}\x{4F9B}\x{4F9C}\x{4F9D}\x{4F9E}\x{4F9F}\x{4FA0}\x{4FA1}' + . '\x{4FA3}\x{4FA4}\x{4FA5}\x{4FA6}\x{4FA7}\x{4FA8}\x{4FA9}\x{4FAA}\x{4FAB}' + . '\x{4FAC}\x{4FAE}\x{4FAF}\x{4FB0}\x{4FB1}\x{4FB2}\x{4FB3}\x{4FB4}\x{4FB5}' + . '\x{4FB6}\x{4FB7}\x{4FB8}\x{4FB9}\x{4FBA}\x{4FBB}\x{4FBC}\x{4FBE}\x{4FBF}' + . '\x{4FC0}\x{4FC1}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FC5}\x{4FC7}\x{4FC9}\x{4FCA}' + . '\x{4FCB}\x{4FCD}\x{4FCE}\x{4FCF}\x{4FD0}\x{4FD1}\x{4FD2}\x{4FD3}\x{4FD4}' + . '\x{4FD5}\x{4FD6}\x{4FD7}\x{4FD8}\x{4FD9}\x{4FDA}\x{4FDB}\x{4FDC}\x{4FDD}' + . '\x{4FDE}\x{4FDF}\x{4FE0}\x{4FE1}\x{4FE3}\x{4FE4}\x{4FE5}\x{4FE6}\x{4FE7}' + . '\x{4FE8}\x{4FE9}\x{4FEA}\x{4FEB}\x{4FEC}\x{4FED}\x{4FEE}\x{4FEF}\x{4FF0}' + . '\x{4FF1}\x{4FF2}\x{4FF3}\x{4FF4}\x{4FF5}\x{4FF6}\x{4FF7}\x{4FF8}\x{4FF9}' + . '\x{4FFA}\x{4FFB}\x{4FFE}\x{4FFF}\x{5000}\x{5001}\x{5002}\x{5003}\x{5004}' + . '\x{5005}\x{5006}\x{5007}\x{5008}\x{5009}\x{500A}\x{500B}\x{500C}\x{500D}' + . '\x{500E}\x{500F}\x{5011}\x{5012}\x{5013}\x{5014}\x{5015}\x{5016}\x{5017}' + . '\x{5018}\x{5019}\x{501A}\x{501B}\x{501C}\x{501D}\x{501E}\x{501F}\x{5020}' + . '\x{5021}\x{5022}\x{5023}\x{5024}\x{5025}\x{5026}\x{5027}\x{5028}\x{5029}' + . '\x{502A}\x{502B}\x{502C}\x{502D}\x{502E}\x{502F}\x{5030}\x{5031}\x{5032}' + . '\x{5033}\x{5035}\x{5036}\x{5037}\x{5039}\x{503A}\x{503B}\x{503C}\x{503E}' + . '\x{503F}\x{5040}\x{5041}\x{5043}\x{5044}\x{5045}\x{5046}\x{5047}\x{5048}' + . '\x{5049}\x{504A}\x{504B}\x{504C}\x{504D}\x{504E}\x{504F}\x{5051}\x{5053}' + . '\x{5054}\x{5055}\x{5056}\x{5057}\x{5059}\x{505A}\x{505B}\x{505C}\x{505D}' + . '\x{505E}\x{505F}\x{5060}\x{5061}\x{5062}\x{5063}\x{5064}\x{5065}\x{5066}' + . '\x{5067}\x{5068}\x{5069}\x{506A}\x{506B}\x{506C}\x{506D}\x{506E}\x{506F}' + . '\x{5070}\x{5071}\x{5072}\x{5073}\x{5074}\x{5075}\x{5076}\x{5077}\x{5078}' + . '\x{5079}\x{507A}\x{507B}\x{507D}\x{507E}\x{507F}\x{5080}\x{5082}\x{5083}' + . '\x{5084}\x{5085}\x{5086}\x{5087}\x{5088}\x{5089}\x{508A}\x{508B}\x{508C}' + . '\x{508D}\x{508E}\x{508F}\x{5090}\x{5091}\x{5092}\x{5094}\x{5095}\x{5096}' + . '\x{5098}\x{5099}\x{509A}\x{509B}\x{509C}\x{509D}\x{509E}\x{50A2}\x{50A3}' + . '\x{50A4}\x{50A5}\x{50A6}\x{50A7}\x{50A8}\x{50A9}\x{50AA}\x{50AB}\x{50AC}' + . '\x{50AD}\x{50AE}\x{50AF}\x{50B0}\x{50B1}\x{50B2}\x{50B3}\x{50B4}\x{50B5}' + . '\x{50B6}\x{50B7}\x{50B8}\x{50BA}\x{50BB}\x{50BC}\x{50BD}\x{50BE}\x{50BF}' + . '\x{50C0}\x{50C1}\x{50C2}\x{50C4}\x{50C5}\x{50C6}\x{50C7}\x{50C8}\x{50C9}' + . '\x{50CA}\x{50CB}\x{50CC}\x{50CD}\x{50CE}\x{50CF}\x{50D0}\x{50D1}\x{50D2}' + . '\x{50D3}\x{50D4}\x{50D5}\x{50D6}\x{50D7}\x{50D9}\x{50DA}\x{50DB}\x{50DC}' + . '\x{50DD}\x{50DE}\x{50E0}\x{50E3}\x{50E4}\x{50E5}\x{50E6}\x{50E7}\x{50E8}' + . '\x{50E9}\x{50EA}\x{50EC}\x{50ED}\x{50EE}\x{50EF}\x{50F0}\x{50F1}\x{50F2}' + . '\x{50F3}\x{50F5}\x{50F6}\x{50F8}\x{50F9}\x{50FA}\x{50FB}\x{50FC}\x{50FD}' + . '\x{50FE}\x{50FF}\x{5100}\x{5101}\x{5102}\x{5103}\x{5104}\x{5105}\x{5106}' + . '\x{5107}\x{5108}\x{5109}\x{510A}\x{510B}\x{510C}\x{510D}\x{510E}\x{510F}' + . '\x{5110}\x{5111}\x{5112}\x{5113}\x{5114}\x{5115}\x{5116}\x{5117}\x{5118}' + . '\x{5119}\x{511A}\x{511C}\x{511D}\x{511E}\x{511F}\x{5120}\x{5121}\x{5122}' + . '\x{5123}\x{5124}\x{5125}\x{5126}\x{5127}\x{5129}\x{512A}\x{512C}\x{512D}' + . '\x{512E}\x{512F}\x{5130}\x{5131}\x{5132}\x{5133}\x{5134}\x{5135}\x{5136}' + . '\x{5137}\x{5138}\x{5139}\x{513A}\x{513B}\x{513C}\x{513D}\x{513E}\x{513F}' + . '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' + . '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5151}\x{5152}\x{5154}\x{5155}' + . '\x{5156}\x{5157}\x{5159}\x{515A}\x{515B}\x{515C}\x{515D}\x{515E}\x{515F}' + . '\x{5161}\x{5162}\x{5163}\x{5165}\x{5166}\x{5167}\x{5168}\x{5169}\x{516A}' + . '\x{516B}\x{516C}\x{516D}\x{516E}\x{516F}\x{5170}\x{5171}\x{5173}\x{5174}' + . '\x{5175}\x{5176}\x{5177}\x{5178}\x{5179}\x{517A}\x{517B}\x{517C}\x{517D}' + . '\x{517F}\x{5180}\x{5181}\x{5182}\x{5185}\x{5186}\x{5187}\x{5188}\x{5189}' + . '\x{518A}\x{518B}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}\x{5193}' + . '\x{5194}\x{5195}\x{5196}\x{5197}\x{5198}\x{5199}\x{519A}\x{519B}\x{519C}' + . '\x{519D}\x{519E}\x{519F}\x{51A0}\x{51A2}\x{51A4}\x{51A5}\x{51A6}\x{51A7}' + . '\x{51A8}\x{51AA}\x{51AB}\x{51AC}\x{51AE}\x{51AF}\x{51B0}\x{51B1}\x{51B2}' + . '\x{51B3}\x{51B5}\x{51B6}\x{51B7}\x{51B9}\x{51BB}\x{51BC}\x{51BD}\x{51BE}' + . '\x{51BF}\x{51C0}\x{51C1}\x{51C3}\x{51C4}\x{51C5}\x{51C6}\x{51C7}\x{51C8}' + . '\x{51C9}\x{51CA}\x{51CB}\x{51CC}\x{51CD}\x{51CE}\x{51CF}\x{51D0}\x{51D1}' + . '\x{51D4}\x{51D5}\x{51D6}\x{51D7}\x{51D8}\x{51D9}\x{51DA}\x{51DB}\x{51DC}' + . '\x{51DD}\x{51DE}\x{51E0}\x{51E1}\x{51E2}\x{51E3}\x{51E4}\x{51E5}\x{51E7}' + . '\x{51E8}\x{51E9}\x{51EA}\x{51EB}\x{51ED}\x{51EF}\x{51F0}\x{51F1}\x{51F3}' + . '\x{51F4}\x{51F5}\x{51F6}\x{51F7}\x{51F8}\x{51F9}\x{51FA}\x{51FB}\x{51FC}' + . '\x{51FD}\x{51FE}\x{51FF}\x{5200}\x{5201}\x{5202}\x{5203}\x{5204}\x{5205}' + . '\x{5206}\x{5207}\x{5208}\x{5209}\x{520A}\x{520B}\x{520C}\x{520D}\x{520E}' + . '\x{520F}\x{5210}\x{5211}\x{5212}\x{5213}\x{5214}\x{5215}\x{5216}\x{5217}' + . '\x{5218}\x{5219}\x{521A}\x{521B}\x{521C}\x{521D}\x{521E}\x{521F}\x{5220}' + . '\x{5221}\x{5222}\x{5223}\x{5224}\x{5225}\x{5226}\x{5228}\x{5229}\x{522A}' + . '\x{522B}\x{522C}\x{522D}\x{522E}\x{522F}\x{5230}\x{5231}\x{5232}\x{5233}' + . '\x{5234}\x{5235}\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{523C}' + . '\x{523D}\x{523E}\x{523F}\x{5240}\x{5241}\x{5242}\x{5243}\x{5244}\x{5245}' + . '\x{5246}\x{5247}\x{5248}\x{5249}\x{524A}\x{524B}\x{524C}\x{524D}\x{524E}' + . '\x{5250}\x{5251}\x{5252}\x{5254}\x{5255}\x{5256}\x{5257}\x{5258}\x{5259}' + . '\x{525A}\x{525B}\x{525C}\x{525D}\x{525E}\x{525F}\x{5260}\x{5261}\x{5262}' + . '\x{5263}\x{5264}\x{5265}\x{5267}\x{5268}\x{5269}\x{526A}\x{526B}\x{526C}' + . '\x{526D}\x{526E}\x{526F}\x{5270}\x{5272}\x{5273}\x{5274}\x{5275}\x{5276}' + . '\x{5277}\x{5278}\x{527A}\x{527B}\x{527C}\x{527D}\x{527E}\x{527F}\x{5280}' + . '\x{5281}\x{5282}\x{5283}\x{5284}\x{5286}\x{5287}\x{5288}\x{5289}\x{528A}' + . '\x{528B}\x{528C}\x{528D}\x{528F}\x{5290}\x{5291}\x{5292}\x{5293}\x{5294}' + . '\x{5295}\x{5296}\x{5297}\x{5298}\x{5299}\x{529A}\x{529B}\x{529C}\x{529D}' + . '\x{529E}\x{529F}\x{52A0}\x{52A1}\x{52A2}\x{52A3}\x{52A5}\x{52A6}\x{52A7}' + . '\x{52A8}\x{52A9}\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52AE}\x{52AF}\x{52B0}' + . '\x{52B1}\x{52B2}\x{52B3}\x{52B4}\x{52B5}\x{52B6}\x{52B7}\x{52B8}\x{52B9}' + . '\x{52BA}\x{52BB}\x{52BC}\x{52BD}\x{52BE}\x{52BF}\x{52C0}\x{52C1}\x{52C2}' + . '\x{52C3}\x{52C6}\x{52C7}\x{52C9}\x{52CA}\x{52CB}\x{52CD}\x{52CF}\x{52D0}' + . '\x{52D2}\x{52D3}\x{52D5}\x{52D6}\x{52D7}\x{52D8}\x{52D9}\x{52DA}\x{52DB}' + . '\x{52DC}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}\x{52E4}\x{52E6}' + . '\x{52E7}\x{52E8}\x{52E9}\x{52EA}\x{52EB}\x{52EC}\x{52ED}\x{52EF}\x{52F0}' + . '\x{52F1}\x{52F2}\x{52F3}\x{52F4}\x{52F5}\x{52F6}\x{52F7}\x{52F8}\x{52F9}' + . '\x{52FA}\x{52FB}\x{52FC}\x{52FD}\x{52FE}\x{52FF}\x{5300}\x{5301}\x{5302}' + . '\x{5305}\x{5306}\x{5307}\x{5308}\x{5309}\x{530A}\x{530B}\x{530C}\x{530D}' + . '\x{530E}\x{530F}\x{5310}\x{5311}\x{5312}\x{5313}\x{5314}\x{5315}\x{5316}' + . '\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}\x{5320}\x{5321}\x{5322}' + . '\x{5323}\x{5324}\x{5325}\x{5326}\x{5328}\x{532A}\x{532B}\x{532C}\x{532D}' + . '\x{532E}\x{532F}\x{5330}\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}\x{533A}' + . '\x{533B}\x{533C}\x{533D}\x{533E}\x{533F}\x{5340}\x{5341}\x{5343}\x{5344}' + . '\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}\x{534A}\x{534B}\x{534C}\x{534D}' + . '\x{534E}\x{534F}\x{5350}\x{5351}\x{5352}\x{5353}\x{5354}\x{5355}\x{5356}' + . '\x{5357}\x{5358}\x{5359}\x{535A}\x{535C}\x{535E}\x{535F}\x{5360}\x{5361}' + . '\x{5362}\x{5363}\x{5364}\x{5365}\x{5366}\x{5367}\x{5369}\x{536B}\x{536C}' + . '\x{536E}\x{536F}\x{5370}\x{5371}\x{5372}\x{5373}\x{5374}\x{5375}\x{5376}' + . '\x{5377}\x{5378}\x{5379}\x{537A}\x{537B}\x{537C}\x{537D}\x{537E}\x{537F}' + . '\x{5381}\x{5382}\x{5383}\x{5384}\x{5385}\x{5386}\x{5387}\x{5388}\x{5389}' + . '\x{538A}\x{538B}\x{538C}\x{538D}\x{538E}\x{538F}\x{5390}\x{5391}\x{5392}' + . '\x{5393}\x{5394}\x{5395}\x{5396}\x{5397}\x{5398}\x{5399}\x{539A}\x{539B}' + . '\x{539C}\x{539D}\x{539E}\x{539F}\x{53A0}\x{53A2}\x{53A3}\x{53A4}\x{53A5}' + . '\x{53A6}\x{53A7}\x{53A8}\x{53A9}\x{53AC}\x{53AD}\x{53AE}\x{53B0}\x{53B1}' + . '\x{53B2}\x{53B3}\x{53B4}\x{53B5}\x{53B6}\x{53B7}\x{53B8}\x{53B9}\x{53BB}' + . '\x{53BC}\x{53BD}\x{53BE}\x{53BF}\x{53C0}\x{53C1}\x{53C2}\x{53C3}\x{53C4}' + . '\x{53C6}\x{53C7}\x{53C8}\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}' + . '\x{53D0}\x{53D1}\x{53D2}\x{53D3}\x{53D4}\x{53D5}\x{53D6}\x{53D7}\x{53D8}' + . '\x{53D9}\x{53DB}\x{53DC}\x{53DF}\x{53E0}\x{53E1}\x{53E2}\x{53E3}\x{53E4}' + . '\x{53E5}\x{53E6}\x{53E8}\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}' + . '\x{53EF}\x{53F0}\x{53F1}\x{53F2}\x{53F3}\x{53F4}\x{53F5}\x{53F6}\x{53F7}' + . '\x{53F8}\x{53F9}\x{53FA}\x{53FB}\x{53FC}\x{53FD}\x{53FE}\x{5401}\x{5402}' + . '\x{5403}\x{5404}\x{5405}\x{5406}\x{5407}\x{5408}\x{5409}\x{540A}\x{540B}' + . '\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}\x{5411}\x{5412}\x{5413}\x{5414}' + . '\x{5415}\x{5416}\x{5417}\x{5418}\x{5419}\x{541B}\x{541C}\x{541D}\x{541E}' + . '\x{541F}\x{5420}\x{5421}\x{5423}\x{5424}\x{5425}\x{5426}\x{5427}\x{5428}' + . '\x{5429}\x{542A}\x{542B}\x{542C}\x{542D}\x{542E}\x{542F}\x{5430}\x{5431}' + . '\x{5432}\x{5433}\x{5434}\x{5435}\x{5436}\x{5437}\x{5438}\x{5439}\x{543A}' + . '\x{543B}\x{543C}\x{543D}\x{543E}\x{543F}\x{5440}\x{5441}\x{5442}\x{5443}' + . '\x{5444}\x{5445}\x{5446}\x{5447}\x{5448}\x{5449}\x{544A}\x{544B}\x{544D}' + . '\x{544E}\x{544F}\x{5450}\x{5451}\x{5452}\x{5453}\x{5454}\x{5455}\x{5456}' + . '\x{5457}\x{5458}\x{5459}\x{545A}\x{545B}\x{545C}\x{545E}\x{545F}\x{5460}' + . '\x{5461}\x{5462}\x{5463}\x{5464}\x{5465}\x{5466}\x{5467}\x{5468}\x{546A}' + . '\x{546B}\x{546C}\x{546D}\x{546E}\x{546F}\x{5470}\x{5471}\x{5472}\x{5473}' + . '\x{5474}\x{5475}\x{5476}\x{5477}\x{5478}\x{5479}\x{547A}\x{547B}\x{547C}' + . '\x{547D}\x{547E}\x{547F}\x{5480}\x{5481}\x{5482}\x{5483}\x{5484}\x{5485}' + . '\x{5486}\x{5487}\x{5488}\x{5489}\x{548B}\x{548C}\x{548D}\x{548E}\x{548F}' + . '\x{5490}\x{5491}\x{5492}\x{5493}\x{5494}\x{5495}\x{5496}\x{5497}\x{5498}' + . '\x{5499}\x{549A}\x{549B}\x{549C}\x{549D}\x{549E}\x{549F}\x{54A0}\x{54A1}' + . '\x{54A2}\x{54A3}\x{54A4}\x{54A5}\x{54A6}\x{54A7}\x{54A8}\x{54A9}\x{54AA}' + . '\x{54AB}\x{54AC}\x{54AD}\x{54AE}\x{54AF}\x{54B0}\x{54B1}\x{54B2}\x{54B3}' + . '\x{54B4}\x{54B6}\x{54B7}\x{54B8}\x{54B9}\x{54BA}\x{54BB}\x{54BC}\x{54BD}' + . '\x{54BE}\x{54BF}\x{54C0}\x{54C1}\x{54C2}\x{54C3}\x{54C4}\x{54C5}\x{54C6}' + . '\x{54C7}\x{54C8}\x{54C9}\x{54CA}\x{54CB}\x{54CC}\x{54CD}\x{54CE}\x{54CF}' + . '\x{54D0}\x{54D1}\x{54D2}\x{54D3}\x{54D4}\x{54D5}\x{54D6}\x{54D7}\x{54D8}' + . '\x{54D9}\x{54DA}\x{54DB}\x{54DC}\x{54DD}\x{54DE}\x{54DF}\x{54E0}\x{54E1}' + . '\x{54E2}\x{54E3}\x{54E4}\x{54E5}\x{54E6}\x{54E7}\x{54E8}\x{54E9}\x{54EA}' + . '\x{54EB}\x{54EC}\x{54ED}\x{54EE}\x{54EF}\x{54F0}\x{54F1}\x{54F2}\x{54F3}' + . '\x{54F4}\x{54F5}\x{54F7}\x{54F8}\x{54F9}\x{54FA}\x{54FB}\x{54FC}\x{54FD}' + . '\x{54FE}\x{54FF}\x{5500}\x{5501}\x{5502}\x{5503}\x{5504}\x{5505}\x{5506}' + . '\x{5507}\x{5508}\x{5509}\x{550A}\x{550B}\x{550C}\x{550D}\x{550E}\x{550F}' + . '\x{5510}\x{5511}\x{5512}\x{5513}\x{5514}\x{5516}\x{5517}\x{551A}\x{551B}' + . '\x{551C}\x{551D}\x{551E}\x{551F}\x{5520}\x{5521}\x{5522}\x{5523}\x{5524}' + . '\x{5525}\x{5526}\x{5527}\x{5528}\x{5529}\x{552A}\x{552B}\x{552C}\x{552D}' + . '\x{552E}\x{552F}\x{5530}\x{5531}\x{5532}\x{5533}\x{5534}\x{5535}\x{5536}' + . '\x{5537}\x{5538}\x{5539}\x{553A}\x{553B}\x{553C}\x{553D}\x{553E}\x{553F}' + . '\x{5540}\x{5541}\x{5542}\x{5543}\x{5544}\x{5545}\x{5546}\x{5548}\x{5549}' + . '\x{554A}\x{554B}\x{554C}\x{554D}\x{554E}\x{554F}\x{5550}\x{5551}\x{5552}' + . '\x{5553}\x{5554}\x{5555}\x{5556}\x{5557}\x{5558}\x{5559}\x{555A}\x{555B}' + . '\x{555C}\x{555D}\x{555E}\x{555F}\x{5561}\x{5562}\x{5563}\x{5564}\x{5565}' + . '\x{5566}\x{5567}\x{5568}\x{5569}\x{556A}\x{556B}\x{556C}\x{556D}\x{556E}' + . '\x{556F}\x{5570}\x{5571}\x{5572}\x{5573}\x{5574}\x{5575}\x{5576}\x{5577}' + . '\x{5578}\x{5579}\x{557B}\x{557C}\x{557D}\x{557E}\x{557F}\x{5580}\x{5581}' + . '\x{5582}\x{5583}\x{5584}\x{5585}\x{5586}\x{5587}\x{5588}\x{5589}\x{558A}' + . '\x{558B}\x{558C}\x{558D}\x{558E}\x{558F}\x{5590}\x{5591}\x{5592}\x{5593}' + . '\x{5594}\x{5595}\x{5596}\x{5597}\x{5598}\x{5599}\x{559A}\x{559B}\x{559C}' + . '\x{559D}\x{559E}\x{559F}\x{55A0}\x{55A1}\x{55A2}\x{55A3}\x{55A4}\x{55A5}' + . '\x{55A6}\x{55A7}\x{55A8}\x{55A9}\x{55AA}\x{55AB}\x{55AC}\x{55AD}\x{55AE}' + . '\x{55AF}\x{55B0}\x{55B1}\x{55B2}\x{55B3}\x{55B4}\x{55B5}\x{55B6}\x{55B7}' + . '\x{55B8}\x{55B9}\x{55BA}\x{55BB}\x{55BC}\x{55BD}\x{55BE}\x{55BF}\x{55C0}' + . '\x{55C1}\x{55C2}\x{55C3}\x{55C4}\x{55C5}\x{55C6}\x{55C7}\x{55C8}\x{55C9}' + . '\x{55CA}\x{55CB}\x{55CC}\x{55CD}\x{55CE}\x{55CF}\x{55D0}\x{55D1}\x{55D2}' + . '\x{55D3}\x{55D4}\x{55D5}\x{55D6}\x{55D7}\x{55D8}\x{55D9}\x{55DA}\x{55DB}' + . '\x{55DC}\x{55DD}\x{55DE}\x{55DF}\x{55E1}\x{55E2}\x{55E3}\x{55E4}\x{55E5}' + . '\x{55E6}\x{55E7}\x{55E8}\x{55E9}\x{55EA}\x{55EB}\x{55EC}\x{55ED}\x{55EE}' + . '\x{55EF}\x{55F0}\x{55F1}\x{55F2}\x{55F3}\x{55F4}\x{55F5}\x{55F6}\x{55F7}' + . '\x{55F9}\x{55FA}\x{55FB}\x{55FC}\x{55FD}\x{55FE}\x{55FF}\x{5600}\x{5601}' + . '\x{5602}\x{5603}\x{5604}\x{5606}\x{5607}\x{5608}\x{5609}\x{560C}\x{560D}' + . '\x{560E}\x{560F}\x{5610}\x{5611}\x{5612}\x{5613}\x{5614}\x{5615}\x{5616}' + . '\x{5617}\x{5618}\x{5619}\x{561A}\x{561B}\x{561C}\x{561D}\x{561E}\x{561F}' + . '\x{5621}\x{5622}\x{5623}\x{5624}\x{5625}\x{5626}\x{5627}\x{5628}\x{5629}' + . '\x{562A}\x{562C}\x{562D}\x{562E}\x{562F}\x{5630}\x{5631}\x{5632}\x{5633}' + . '\x{5634}\x{5635}\x{5636}\x{5638}\x{5639}\x{563A}\x{563B}\x{563D}\x{563E}' + . '\x{563F}\x{5640}\x{5641}\x{5642}\x{5643}\x{5645}\x{5646}\x{5647}\x{5648}' + . '\x{5649}\x{564A}\x{564C}\x{564D}\x{564E}\x{564F}\x{5650}\x{5652}\x{5653}' + . '\x{5654}\x{5655}\x{5657}\x{5658}\x{5659}\x{565A}\x{565B}\x{565C}\x{565D}' + . '\x{565E}\x{5660}\x{5662}\x{5663}\x{5664}\x{5665}\x{5666}\x{5667}\x{5668}' + . '\x{5669}\x{566A}\x{566B}\x{566C}\x{566D}\x{566E}\x{566F}\x{5670}\x{5671}' + . '\x{5672}\x{5673}\x{5674}\x{5676}\x{5677}\x{5678}\x{5679}\x{567A}\x{567B}' + . '\x{567C}\x{567E}\x{567F}\x{5680}\x{5681}\x{5682}\x{5683}\x{5684}\x{5685}' + . '\x{5686}\x{5687}\x{568A}\x{568C}\x{568D}\x{568E}\x{568F}\x{5690}\x{5691}' + . '\x{5692}\x{5693}\x{5694}\x{5695}\x{5697}\x{5698}\x{5699}\x{569A}\x{569B}' + . '\x{569C}\x{569D}\x{569F}\x{56A0}\x{56A1}\x{56A3}\x{56A4}\x{56A5}\x{56A6}' + . '\x{56A7}\x{56A8}\x{56A9}\x{56AA}\x{56AB}\x{56AC}\x{56AD}\x{56AE}\x{56AF}' + . '\x{56B0}\x{56B1}\x{56B2}\x{56B3}\x{56B4}\x{56B5}\x{56B6}\x{56B7}\x{56B8}' + . '\x{56B9}\x{56BB}\x{56BC}\x{56BD}\x{56BE}\x{56BF}\x{56C0}\x{56C1}\x{56C2}' + . '\x{56C3}\x{56C4}\x{56C5}\x{56C6}\x{56C7}\x{56C8}\x{56C9}\x{56CA}\x{56CB}' + . '\x{56CC}\x{56CD}\x{56CE}\x{56D0}\x{56D1}\x{56D2}\x{56D3}\x{56D4}\x{56D5}' + . '\x{56D6}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DC}\x{56DD}\x{56DE}\x{56DF}' + . '\x{56E0}\x{56E1}\x{56E2}\x{56E3}\x{56E4}\x{56E5}\x{56E7}\x{56E8}\x{56E9}' + . '\x{56EA}\x{56EB}\x{56EC}\x{56ED}\x{56EE}\x{56EF}\x{56F0}\x{56F1}\x{56F2}' + . '\x{56F3}\x{56F4}\x{56F5}\x{56F7}\x{56F9}\x{56FA}\x{56FD}\x{56FE}\x{56FF}' + . '\x{5700}\x{5701}\x{5702}\x{5703}\x{5704}\x{5706}\x{5707}\x{5708}\x{5709}' + . '\x{570A}\x{570B}\x{570C}\x{570D}\x{570E}\x{570F}\x{5710}\x{5712}\x{5713}' + . '\x{5714}\x{5715}\x{5716}\x{5718}\x{5719}\x{571A}\x{571B}\x{571C}\x{571D}' + . '\x{571E}\x{571F}\x{5720}\x{5722}\x{5723}\x{5725}\x{5726}\x{5727}\x{5728}' + . '\x{5729}\x{572A}\x{572B}\x{572C}\x{572D}\x{572E}\x{572F}\x{5730}\x{5731}' + . '\x{5732}\x{5733}\x{5734}\x{5735}\x{5736}\x{5737}\x{5738}\x{5739}\x{573A}' + . '\x{573B}\x{573C}\x{573E}\x{573F}\x{5740}\x{5741}\x{5742}\x{5744}\x{5745}' + . '\x{5746}\x{5747}\x{5749}\x{574A}\x{574B}\x{574C}\x{574D}\x{574E}\x{574F}' + . '\x{5750}\x{5751}\x{5752}\x{5753}\x{5754}\x{5757}\x{5759}\x{575A}\x{575B}' + . '\x{575C}\x{575D}\x{575E}\x{575F}\x{5760}\x{5761}\x{5762}\x{5764}\x{5765}' + . '\x{5766}\x{5767}\x{5768}\x{5769}\x{576A}\x{576B}\x{576C}\x{576D}\x{576F}' + . '\x{5770}\x{5771}\x{5772}\x{5773}\x{5774}\x{5775}\x{5776}\x{5777}\x{5779}' + . '\x{577A}\x{577B}\x{577C}\x{577D}\x{577E}\x{577F}\x{5780}\x{5782}\x{5783}' + . '\x{5784}\x{5785}\x{5786}\x{5788}\x{5789}\x{578A}\x{578B}\x{578C}\x{578D}' + . '\x{578E}\x{578F}\x{5790}\x{5791}\x{5792}\x{5793}\x{5794}\x{5795}\x{5797}' + . '\x{5798}\x{5799}\x{579A}\x{579B}\x{579C}\x{579D}\x{579E}\x{579F}\x{57A0}' + . '\x{57A1}\x{57A2}\x{57A3}\x{57A4}\x{57A5}\x{57A6}\x{57A7}\x{57A9}\x{57AA}' + . '\x{57AB}\x{57AC}\x{57AD}\x{57AE}\x{57AF}\x{57B0}\x{57B1}\x{57B2}\x{57B3}' + . '\x{57B4}\x{57B5}\x{57B6}\x{57B7}\x{57B8}\x{57B9}\x{57BA}\x{57BB}\x{57BC}' + . '\x{57BD}\x{57BE}\x{57BF}\x{57C0}\x{57C1}\x{57C2}\x{57C3}\x{57C4}\x{57C5}' + . '\x{57C6}\x{57C7}\x{57C8}\x{57C9}\x{57CB}\x{57CC}\x{57CD}\x{57CE}\x{57CF}' + . '\x{57D0}\x{57D2}\x{57D3}\x{57D4}\x{57D5}\x{57D6}\x{57D8}\x{57D9}\x{57DA}' + . '\x{57DC}\x{57DD}\x{57DF}\x{57E0}\x{57E1}\x{57E2}\x{57E3}\x{57E4}\x{57E5}' + . '\x{57E6}\x{57E7}\x{57E8}\x{57E9}\x{57EA}\x{57EB}\x{57EC}\x{57ED}\x{57EE}' + . '\x{57EF}\x{57F0}\x{57F1}\x{57F2}\x{57F3}\x{57F4}\x{57F5}\x{57F6}\x{57F7}' + . '\x{57F8}\x{57F9}\x{57FA}\x{57FB}\x{57FC}\x{57FD}\x{57FE}\x{57FF}\x{5800}' + . '\x{5801}\x{5802}\x{5803}\x{5804}\x{5805}\x{5806}\x{5807}\x{5808}\x{5809}' + . '\x{580A}\x{580B}\x{580C}\x{580D}\x{580E}\x{580F}\x{5810}\x{5811}\x{5812}' + . '\x{5813}\x{5814}\x{5815}\x{5816}\x{5819}\x{581A}\x{581B}\x{581C}\x{581D}' + . '\x{581E}\x{581F}\x{5820}\x{5821}\x{5822}\x{5823}\x{5824}\x{5825}\x{5826}' + . '\x{5827}\x{5828}\x{5829}\x{582A}\x{582B}\x{582C}\x{582D}\x{582E}\x{582F}' + . '\x{5830}\x{5831}\x{5832}\x{5833}\x{5834}\x{5835}\x{5836}\x{5837}\x{5838}' + . '\x{5839}\x{583A}\x{583B}\x{583C}\x{583D}\x{583E}\x{583F}\x{5840}\x{5842}' + . '\x{5843}\x{5844}\x{5845}\x{5846}\x{5847}\x{5848}\x{5849}\x{584A}\x{584B}' + . '\x{584C}\x{584D}\x{584E}\x{584F}\x{5851}\x{5852}\x{5853}\x{5854}\x{5855}' + . '\x{5857}\x{5858}\x{5859}\x{585A}\x{585B}\x{585C}\x{585D}\x{585E}\x{585F}' + . '\x{5861}\x{5862}\x{5863}\x{5864}\x{5865}\x{5868}\x{5869}\x{586A}\x{586B}' + . '\x{586C}\x{586D}\x{586E}\x{586F}\x{5870}\x{5871}\x{5872}\x{5873}\x{5874}' + . '\x{5875}\x{5876}\x{5878}\x{5879}\x{587A}\x{587B}\x{587C}\x{587D}\x{587E}' + . '\x{587F}\x{5880}\x{5881}\x{5882}\x{5883}\x{5884}\x{5885}\x{5886}\x{5887}' + . '\x{5888}\x{5889}\x{588A}\x{588B}\x{588C}\x{588D}\x{588E}\x{588F}\x{5890}' + . '\x{5891}\x{5892}\x{5893}\x{5894}\x{5896}\x{5897}\x{5898}\x{5899}\x{589A}' + . '\x{589B}\x{589C}\x{589D}\x{589E}\x{589F}\x{58A0}\x{58A1}\x{58A2}\x{58A3}' + . '\x{58A4}\x{58A5}\x{58A6}\x{58A7}\x{58A8}\x{58A9}\x{58AB}\x{58AC}\x{58AD}' + . '\x{58AE}\x{58AF}\x{58B0}\x{58B1}\x{58B2}\x{58B3}\x{58B4}\x{58B7}\x{58B8}' + . '\x{58B9}\x{58BA}\x{58BB}\x{58BC}\x{58BD}\x{58BE}\x{58BF}\x{58C1}\x{58C2}' + . '\x{58C5}\x{58C6}\x{58C7}\x{58C8}\x{58C9}\x{58CA}\x{58CB}\x{58CE}\x{58CF}' + . '\x{58D1}\x{58D2}\x{58D3}\x{58D4}\x{58D5}\x{58D6}\x{58D7}\x{58D8}\x{58D9}' + . '\x{58DA}\x{58DB}\x{58DD}\x{58DE}\x{58DF}\x{58E0}\x{58E2}\x{58E3}\x{58E4}' + . '\x{58E5}\x{58E7}\x{58E8}\x{58E9}\x{58EA}\x{58EB}\x{58EC}\x{58ED}\x{58EE}' + . '\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F3}\x{58F4}\x{58F6}\x{58F7}\x{58F8}' + . '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{58FE}\x{58FF}\x{5900}\x{5902}' + . '\x{5903}\x{5904}\x{5906}\x{5907}\x{5909}\x{590A}\x{590B}\x{590C}\x{590D}' + . '\x{590E}\x{590F}\x{5910}\x{5912}\x{5914}\x{5915}\x{5916}\x{5917}\x{5918}' + . '\x{5919}\x{591A}\x{591B}\x{591C}\x{591D}\x{591E}\x{591F}\x{5920}\x{5921}' + . '\x{5922}\x{5924}\x{5925}\x{5926}\x{5927}\x{5928}\x{5929}\x{592A}\x{592B}' + . '\x{592C}\x{592D}\x{592E}\x{592F}\x{5930}\x{5931}\x{5932}\x{5934}\x{5935}' + . '\x{5937}\x{5938}\x{5939}\x{593A}\x{593B}\x{593C}\x{593D}\x{593E}\x{593F}' + . '\x{5940}\x{5941}\x{5942}\x{5943}\x{5944}\x{5945}\x{5946}\x{5947}\x{5948}' + . '\x{5949}\x{594A}\x{594B}\x{594C}\x{594D}\x{594E}\x{594F}\x{5950}\x{5951}' + . '\x{5952}\x{5953}\x{5954}\x{5955}\x{5956}\x{5957}\x{5958}\x{595A}\x{595C}' + . '\x{595D}\x{595E}\x{595F}\x{5960}\x{5961}\x{5962}\x{5963}\x{5964}\x{5965}' + . '\x{5966}\x{5967}\x{5968}\x{5969}\x{596A}\x{596B}\x{596C}\x{596D}\x{596E}' + . '\x{596F}\x{5970}\x{5971}\x{5972}\x{5973}\x{5974}\x{5975}\x{5976}\x{5977}' + . '\x{5978}\x{5979}\x{597A}\x{597B}\x{597C}\x{597D}\x{597E}\x{597F}\x{5980}' + . '\x{5981}\x{5982}\x{5983}\x{5984}\x{5985}\x{5986}\x{5987}\x{5988}\x{5989}' + . '\x{598A}\x{598B}\x{598C}\x{598D}\x{598E}\x{598F}\x{5990}\x{5991}\x{5992}' + . '\x{5993}\x{5994}\x{5995}\x{5996}\x{5997}\x{5998}\x{5999}\x{599A}\x{599C}' + . '\x{599D}\x{599E}\x{599F}\x{59A0}\x{59A1}\x{59A2}\x{59A3}\x{59A4}\x{59A5}' + . '\x{59A6}\x{59A7}\x{59A8}\x{59A9}\x{59AA}\x{59AB}\x{59AC}\x{59AD}\x{59AE}' + . '\x{59AF}\x{59B0}\x{59B1}\x{59B2}\x{59B3}\x{59B4}\x{59B5}\x{59B6}\x{59B8}' + . '\x{59B9}\x{59BA}\x{59BB}\x{59BC}\x{59BD}\x{59BE}\x{59BF}\x{59C0}\x{59C1}' + . '\x{59C2}\x{59C3}\x{59C4}\x{59C5}\x{59C6}\x{59C7}\x{59C8}\x{59C9}\x{59CA}' + . '\x{59CB}\x{59CC}\x{59CD}\x{59CE}\x{59CF}\x{59D0}\x{59D1}\x{59D2}\x{59D3}' + . '\x{59D4}\x{59D5}\x{59D6}\x{59D7}\x{59D8}\x{59D9}\x{59DA}\x{59DB}\x{59DC}' + . '\x{59DD}\x{59DE}\x{59DF}\x{59E0}\x{59E1}\x{59E2}\x{59E3}\x{59E4}\x{59E5}' + . '\x{59E6}\x{59E8}\x{59E9}\x{59EA}\x{59EB}\x{59EC}\x{59ED}\x{59EE}\x{59EF}' + . '\x{59F0}\x{59F1}\x{59F2}\x{59F3}\x{59F4}\x{59F5}\x{59F6}\x{59F7}\x{59F8}' + . '\x{59F9}\x{59FA}\x{59FB}\x{59FC}\x{59FD}\x{59FE}\x{59FF}\x{5A00}\x{5A01}' + . '\x{5A02}\x{5A03}\x{5A04}\x{5A05}\x{5A06}\x{5A07}\x{5A08}\x{5A09}\x{5A0A}' + . '\x{5A0B}\x{5A0C}\x{5A0D}\x{5A0E}\x{5A0F}\x{5A10}\x{5A11}\x{5A12}\x{5A13}' + . '\x{5A14}\x{5A15}\x{5A16}\x{5A17}\x{5A18}\x{5A19}\x{5A1A}\x{5A1B}\x{5A1C}' + . '\x{5A1D}\x{5A1E}\x{5A1F}\x{5A20}\x{5A21}\x{5A22}\x{5A23}\x{5A25}\x{5A27}' + . '\x{5A28}\x{5A29}\x{5A2A}\x{5A2B}\x{5A2D}\x{5A2E}\x{5A2F}\x{5A31}\x{5A32}' + . '\x{5A33}\x{5A34}\x{5A35}\x{5A36}\x{5A37}\x{5A38}\x{5A39}\x{5A3A}\x{5A3B}' + . '\x{5A3C}\x{5A3D}\x{5A3E}\x{5A3F}\x{5A40}\x{5A41}\x{5A42}\x{5A43}\x{5A44}' + . '\x{5A45}\x{5A46}\x{5A47}\x{5A48}\x{5A49}\x{5A4A}\x{5A4B}\x{5A4C}\x{5A4D}' + . '\x{5A4E}\x{5A4F}\x{5A50}\x{5A51}\x{5A52}\x{5A53}\x{5A55}\x{5A56}\x{5A57}' + . '\x{5A58}\x{5A5A}\x{5A5B}\x{5A5C}\x{5A5D}\x{5A5E}\x{5A5F}\x{5A60}\x{5A61}' + . '\x{5A62}\x{5A63}\x{5A64}\x{5A65}\x{5A66}\x{5A67}\x{5A68}\x{5A69}\x{5A6A}' + . '\x{5A6B}\x{5A6C}\x{5A6D}\x{5A6E}\x{5A70}\x{5A72}\x{5A73}\x{5A74}\x{5A75}' + . '\x{5A76}\x{5A77}\x{5A78}\x{5A79}\x{5A7A}\x{5A7B}\x{5A7C}\x{5A7D}\x{5A7E}' + . '\x{5A7F}\x{5A80}\x{5A81}\x{5A82}\x{5A83}\x{5A84}\x{5A85}\x{5A86}\x{5A88}' + . '\x{5A89}\x{5A8A}\x{5A8B}\x{5A8C}\x{5A8E}\x{5A8F}\x{5A90}\x{5A91}\x{5A92}' + . '\x{5A93}\x{5A94}\x{5A95}\x{5A96}\x{5A97}\x{5A98}\x{5A99}\x{5A9A}\x{5A9B}' + . '\x{5A9C}\x{5A9D}\x{5A9E}\x{5A9F}\x{5AA0}\x{5AA1}\x{5AA2}\x{5AA3}\x{5AA4}' + . '\x{5AA5}\x{5AA6}\x{5AA7}\x{5AA8}\x{5AA9}\x{5AAA}\x{5AAC}\x{5AAD}\x{5AAE}' + . '\x{5AAF}\x{5AB0}\x{5AB1}\x{5AB2}\x{5AB3}\x{5AB4}\x{5AB5}\x{5AB6}\x{5AB7}' + . '\x{5AB8}\x{5AB9}\x{5ABA}\x{5ABB}\x{5ABC}\x{5ABD}\x{5ABE}\x{5ABF}\x{5AC0}' + . '\x{5AC1}\x{5AC2}\x{5AC3}\x{5AC4}\x{5AC5}\x{5AC6}\x{5AC7}\x{5AC8}\x{5AC9}' + . '\x{5ACA}\x{5ACB}\x{5ACC}\x{5ACD}\x{5ACE}\x{5ACF}\x{5AD1}\x{5AD2}\x{5AD4}' + . '\x{5AD5}\x{5AD6}\x{5AD7}\x{5AD8}\x{5AD9}\x{5ADA}\x{5ADB}\x{5ADC}\x{5ADD}' + . '\x{5ADE}\x{5ADF}\x{5AE0}\x{5AE1}\x{5AE2}\x{5AE3}\x{5AE4}\x{5AE5}\x{5AE6}' + . '\x{5AE7}\x{5AE8}\x{5AE9}\x{5AEA}\x{5AEB}\x{5AEC}\x{5AED}\x{5AEE}\x{5AF1}' + . '\x{5AF2}\x{5AF3}\x{5AF4}\x{5AF5}\x{5AF6}\x{5AF7}\x{5AF8}\x{5AF9}\x{5AFA}' + . '\x{5AFB}\x{5AFC}\x{5AFD}\x{5AFE}\x{5AFF}\x{5B00}\x{5B01}\x{5B02}\x{5B03}' + . '\x{5B04}\x{5B05}\x{5B06}\x{5B07}\x{5B08}\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}' + . '\x{5B0F}\x{5B10}\x{5B11}\x{5B12}\x{5B13}\x{5B14}\x{5B15}\x{5B16}\x{5B17}' + . '\x{5B18}\x{5B19}\x{5B1A}\x{5B1B}\x{5B1C}\x{5B1D}\x{5B1E}\x{5B1F}\x{5B20}' + . '\x{5B21}\x{5B22}\x{5B23}\x{5B24}\x{5B25}\x{5B26}\x{5B27}\x{5B28}\x{5B29}' + . '\x{5B2A}\x{5B2B}\x{5B2C}\x{5B2D}\x{5B2E}\x{5B2F}\x{5B30}\x{5B31}\x{5B32}' + . '\x{5B33}\x{5B34}\x{5B35}\x{5B36}\x{5B37}\x{5B38}\x{5B3A}\x{5B3B}\x{5B3C}' + . '\x{5B3D}\x{5B3E}\x{5B3F}\x{5B40}\x{5B41}\x{5B42}\x{5B43}\x{5B44}\x{5B45}' + . '\x{5B47}\x{5B48}\x{5B49}\x{5B4A}\x{5B4B}\x{5B4C}\x{5B4D}\x{5B4E}\x{5B50}' + . '\x{5B51}\x{5B53}\x{5B54}\x{5B55}\x{5B56}\x{5B57}\x{5B58}\x{5B59}\x{5B5A}' + . '\x{5B5B}\x{5B5C}\x{5B5D}\x{5B5E}\x{5B5F}\x{5B62}\x{5B63}\x{5B64}\x{5B65}' + . '\x{5B66}\x{5B67}\x{5B68}\x{5B69}\x{5B6A}\x{5B6B}\x{5B6C}\x{5B6D}\x{5B6E}' + . '\x{5B70}\x{5B71}\x{5B72}\x{5B73}\x{5B74}\x{5B75}\x{5B76}\x{5B77}\x{5B78}' + . '\x{5B7A}\x{5B7B}\x{5B7C}\x{5B7D}\x{5B7F}\x{5B80}\x{5B81}\x{5B82}\x{5B83}' + . '\x{5B84}\x{5B85}\x{5B87}\x{5B88}\x{5B89}\x{5B8A}\x{5B8B}\x{5B8C}\x{5B8D}' + . '\x{5B8E}\x{5B8F}\x{5B91}\x{5B92}\x{5B93}\x{5B94}\x{5B95}\x{5B96}\x{5B97}' + . '\x{5B98}\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9E}\x{5B9F}\x{5BA0}' + . '\x{5BA1}\x{5BA2}\x{5BA3}\x{5BA4}\x{5BA5}\x{5BA6}\x{5BA7}\x{5BA8}\x{5BAA}' + . '\x{5BAB}\x{5BAC}\x{5BAD}\x{5BAE}\x{5BAF}\x{5BB0}\x{5BB1}\x{5BB3}\x{5BB4}' + . '\x{5BB5}\x{5BB6}\x{5BB8}\x{5BB9}\x{5BBA}\x{5BBB}\x{5BBD}\x{5BBE}\x{5BBF}' + . '\x{5BC0}\x{5BC1}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BCA}' + . '\x{5BCB}\x{5BCC}\x{5BCD}\x{5BCE}\x{5BCF}\x{5BD0}\x{5BD1}\x{5BD2}\x{5BD3}' + . '\x{5BD4}\x{5BD5}\x{5BD6}\x{5BD8}\x{5BD9}\x{5BDB}\x{5BDC}\x{5BDD}\x{5BDE}' + . '\x{5BDF}\x{5BE0}\x{5BE1}\x{5BE2}\x{5BE3}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}' + . '\x{5BE8}\x{5BE9}\x{5BEA}\x{5BEB}\x{5BEC}\x{5BED}\x{5BEE}\x{5BEF}\x{5BF0}' + . '\x{5BF1}\x{5BF2}\x{5BF3}\x{5BF4}\x{5BF5}\x{5BF6}\x{5BF7}\x{5BF8}\x{5BF9}' + . '\x{5BFA}\x{5BFB}\x{5BFC}\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}\x{5C04}\x{5C05}' + . '\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}\x{5C0B}\x{5C0C}\x{5C0D}\x{5C0E}' + . '\x{5C0F}\x{5C10}\x{5C11}\x{5C12}\x{5C13}\x{5C14}\x{5C15}\x{5C16}\x{5C17}' + . '\x{5C18}\x{5C19}\x{5C1A}\x{5C1C}\x{5C1D}\x{5C1E}\x{5C1F}\x{5C20}\x{5C21}' + . '\x{5C22}\x{5C24}\x{5C25}\x{5C27}\x{5C28}\x{5C2A}\x{5C2B}\x{5C2C}\x{5C2D}' + . '\x{5C2E}\x{5C2F}\x{5C30}\x{5C31}\x{5C32}\x{5C33}\x{5C34}\x{5C35}\x{5C37}' + . '\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}' + . '\x{5C41}\x{5C42}\x{5C43}\x{5C44}\x{5C45}\x{5C46}\x{5C47}\x{5C48}\x{5C49}' + . '\x{5C4A}\x{5C4B}\x{5C4C}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C52}' + . '\x{5C53}\x{5C54}\x{5C55}\x{5C56}\x{5C57}\x{5C58}\x{5C59}\x{5C5B}\x{5C5C}' + . '\x{5C5D}\x{5C5E}\x{5C5F}\x{5C60}\x{5C61}\x{5C62}\x{5C63}\x{5C64}\x{5C65}' + . '\x{5C66}\x{5C67}\x{5C68}\x{5C69}\x{5C6A}\x{5C6B}\x{5C6C}\x{5C6D}\x{5C6E}' + . '\x{5C6F}\x{5C70}\x{5C71}\x{5C72}\x{5C73}\x{5C74}\x{5C75}\x{5C76}\x{5C77}' + . '\x{5C78}\x{5C79}\x{5C7A}\x{5C7B}\x{5C7C}\x{5C7D}\x{5C7E}\x{5C7F}\x{5C80}' + . '\x{5C81}\x{5C82}\x{5C83}\x{5C84}\x{5C86}\x{5C87}\x{5C88}\x{5C89}\x{5C8A}' + . '\x{5C8B}\x{5C8C}\x{5C8D}\x{5C8E}\x{5C8F}\x{5C90}\x{5C91}\x{5C92}\x{5C93}' + . '\x{5C94}\x{5C95}\x{5C96}\x{5C97}\x{5C98}\x{5C99}\x{5C9A}\x{5C9B}\x{5C9C}' + . '\x{5C9D}\x{5C9E}\x{5C9F}\x{5CA0}\x{5CA1}\x{5CA2}\x{5CA3}\x{5CA4}\x{5CA5}' + . '\x{5CA6}\x{5CA7}\x{5CA8}\x{5CA9}\x{5CAA}\x{5CAB}\x{5CAC}\x{5CAD}\x{5CAE}' + . '\x{5CAF}\x{5CB0}\x{5CB1}\x{5CB2}\x{5CB3}\x{5CB5}\x{5CB6}\x{5CB7}\x{5CB8}' + . '\x{5CBA}\x{5CBB}\x{5CBC}\x{5CBD}\x{5CBE}\x{5CBF}\x{5CC1}\x{5CC2}\x{5CC3}' + . '\x{5CC4}\x{5CC5}\x{5CC6}\x{5CC7}\x{5CC8}\x{5CC9}\x{5CCA}\x{5CCB}\x{5CCC}' + . '\x{5CCD}\x{5CCE}\x{5CCF}\x{5CD0}\x{5CD1}\x{5CD2}\x{5CD3}\x{5CD4}\x{5CD6}' + . '\x{5CD7}\x{5CD8}\x{5CD9}\x{5CDA}\x{5CDB}\x{5CDC}\x{5CDE}\x{5CDF}\x{5CE0}' + . '\x{5CE1}\x{5CE2}\x{5CE3}\x{5CE4}\x{5CE5}\x{5CE6}\x{5CE7}\x{5CE8}\x{5CE9}' + . '\x{5CEA}\x{5CEB}\x{5CEC}\x{5CED}\x{5CEE}\x{5CEF}\x{5CF0}\x{5CF1}\x{5CF2}' + . '\x{5CF3}\x{5CF4}\x{5CF6}\x{5CF7}\x{5CF8}\x{5CF9}\x{5CFA}\x{5CFB}\x{5CFC}' + . '\x{5CFD}\x{5CFE}\x{5CFF}\x{5D00}\x{5D01}\x{5D02}\x{5D03}\x{5D04}\x{5D05}' + . '\x{5D06}\x{5D07}\x{5D08}\x{5D09}\x{5D0A}\x{5D0B}\x{5D0C}\x{5D0D}\x{5D0E}' + . '\x{5D0F}\x{5D10}\x{5D11}\x{5D12}\x{5D13}\x{5D14}\x{5D15}\x{5D16}\x{5D17}' + . '\x{5D18}\x{5D19}\x{5D1A}\x{5D1B}\x{5D1C}\x{5D1D}\x{5D1E}\x{5D1F}\x{5D20}' + . '\x{5D21}\x{5D22}\x{5D23}\x{5D24}\x{5D25}\x{5D26}\x{5D27}\x{5D28}\x{5D29}' + . '\x{5D2A}\x{5D2C}\x{5D2D}\x{5D2E}\x{5D30}\x{5D31}\x{5D32}\x{5D33}\x{5D34}' + . '\x{5D35}\x{5D36}\x{5D37}\x{5D38}\x{5D39}\x{5D3A}\x{5D3C}\x{5D3D}\x{5D3E}' + . '\x{5D3F}\x{5D40}\x{5D41}\x{5D42}\x{5D43}\x{5D44}\x{5D45}\x{5D46}\x{5D47}' + . '\x{5D48}\x{5D49}\x{5D4A}\x{5D4B}\x{5D4C}\x{5D4D}\x{5D4E}\x{5D4F}\x{5D50}' + . '\x{5D51}\x{5D52}\x{5D54}\x{5D55}\x{5D56}\x{5D58}\x{5D59}\x{5D5A}\x{5D5B}' + . '\x{5D5D}\x{5D5E}\x{5D5F}\x{5D61}\x{5D62}\x{5D63}\x{5D64}\x{5D65}\x{5D66}' + . '\x{5D67}\x{5D68}\x{5D69}\x{5D6A}\x{5D6B}\x{5D6C}\x{5D6D}\x{5D6E}\x{5D6F}' + . '\x{5D70}\x{5D71}\x{5D72}\x{5D73}\x{5D74}\x{5D75}\x{5D76}\x{5D77}\x{5D78}' + . '\x{5D79}\x{5D7A}\x{5D7B}\x{5D7C}\x{5D7D}\x{5D7E}\x{5D7F}\x{5D80}\x{5D81}' + . '\x{5D82}\x{5D84}\x{5D85}\x{5D86}\x{5D87}\x{5D88}\x{5D89}\x{5D8A}\x{5D8B}' + . '\x{5D8C}\x{5D8D}\x{5D8E}\x{5D8F}\x{5D90}\x{5D91}\x{5D92}\x{5D93}\x{5D94}' + . '\x{5D95}\x{5D97}\x{5D98}\x{5D99}\x{5D9A}\x{5D9B}\x{5D9C}\x{5D9D}\x{5D9E}' + . '\x{5D9F}\x{5DA0}\x{5DA1}\x{5DA2}\x{5DA5}\x{5DA6}\x{5DA7}\x{5DA8}\x{5DA9}' + . '\x{5DAA}\x{5DAC}\x{5DAD}\x{5DAE}\x{5DAF}\x{5DB0}\x{5DB1}\x{5DB2}\x{5DB4}' + . '\x{5DB5}\x{5DB6}\x{5DB7}\x{5DB8}\x{5DBA}\x{5DBB}\x{5DBC}\x{5DBD}\x{5DBE}' + . '\x{5DBF}\x{5DC0}\x{5DC1}\x{5DC2}\x{5DC3}\x{5DC5}\x{5DC6}\x{5DC7}\x{5DC8}' + . '\x{5DC9}\x{5DCA}\x{5DCB}\x{5DCC}\x{5DCD}\x{5DCE}\x{5DCF}\x{5DD0}\x{5DD1}' + . '\x{5DD2}\x{5DD3}\x{5DD4}\x{5DD5}\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}' + . '\x{5DDE}\x{5DDF}\x{5DE0}\x{5DE1}\x{5DE2}\x{5DE3}\x{5DE4}\x{5DE5}\x{5DE6}' + . '\x{5DE7}\x{5DE8}\x{5DE9}\x{5DEA}\x{5DEB}\x{5DEC}\x{5DED}\x{5DEE}\x{5DEF}' + . '\x{5DF0}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DF8}\x{5DF9}' + . '\x{5DFA}\x{5DFB}\x{5DFC}\x{5DFD}\x{5DFE}\x{5DFF}\x{5E00}\x{5E01}\x{5E02}' + . '\x{5E03}\x{5E04}\x{5E05}\x{5E06}\x{5E07}\x{5E08}\x{5E09}\x{5E0A}\x{5E0B}' + . '\x{5E0C}\x{5E0D}\x{5E0E}\x{5E0F}\x{5E10}\x{5E11}\x{5E13}\x{5E14}\x{5E15}' + . '\x{5E16}\x{5E17}\x{5E18}\x{5E19}\x{5E1A}\x{5E1B}\x{5E1C}\x{5E1D}\x{5E1E}' + . '\x{5E1F}\x{5E20}\x{5E21}\x{5E22}\x{5E23}\x{5E24}\x{5E25}\x{5E26}\x{5E27}' + . '\x{5E28}\x{5E29}\x{5E2A}\x{5E2B}\x{5E2C}\x{5E2D}\x{5E2E}\x{5E2F}\x{5E30}' + . '\x{5E31}\x{5E32}\x{5E33}\x{5E34}\x{5E35}\x{5E36}\x{5E37}\x{5E38}\x{5E39}' + . '\x{5E3A}\x{5E3B}\x{5E3C}\x{5E3D}\x{5E3E}\x{5E40}\x{5E41}\x{5E42}\x{5E43}' + . '\x{5E44}\x{5E45}\x{5E46}\x{5E47}\x{5E49}\x{5E4A}\x{5E4B}\x{5E4C}\x{5E4D}' + . '\x{5E4E}\x{5E4F}\x{5E50}\x{5E52}\x{5E53}\x{5E54}\x{5E55}\x{5E56}\x{5E57}' + . '\x{5E58}\x{5E59}\x{5E5A}\x{5E5B}\x{5E5C}\x{5E5D}\x{5E5E}\x{5E5F}\x{5E60}' + . '\x{5E61}\x{5E62}\x{5E63}\x{5E64}\x{5E65}\x{5E66}\x{5E67}\x{5E68}\x{5E69}' + . '\x{5E6A}\x{5E6B}\x{5E6C}\x{5E6D}\x{5E6E}\x{5E6F}\x{5E70}\x{5E71}\x{5E72}' + . '\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E77}\x{5E78}\x{5E79}\x{5E7A}\x{5E7B}' + . '\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E80}\x{5E81}\x{5E82}\x{5E83}\x{5E84}' + . '\x{5E85}\x{5E86}\x{5E87}\x{5E88}\x{5E89}\x{5E8A}\x{5E8B}\x{5E8C}\x{5E8D}' + . '\x{5E8E}\x{5E8F}\x{5E90}\x{5E91}\x{5E93}\x{5E94}\x{5E95}\x{5E96}\x{5E97}' + . '\x{5E98}\x{5E99}\x{5E9A}\x{5E9B}\x{5E9C}\x{5E9D}\x{5E9E}\x{5E9F}\x{5EA0}' + . '\x{5EA1}\x{5EA2}\x{5EA3}\x{5EA4}\x{5EA5}\x{5EA6}\x{5EA7}\x{5EA8}\x{5EA9}' + . '\x{5EAA}\x{5EAB}\x{5EAC}\x{5EAD}\x{5EAE}\x{5EAF}\x{5EB0}\x{5EB1}\x{5EB2}' + . '\x{5EB3}\x{5EB4}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EB9}\x{5EBB}\x{5EBC}' + . '\x{5EBD}\x{5EBE}\x{5EBF}\x{5EC1}\x{5EC2}\x{5EC3}\x{5EC4}\x{5EC5}\x{5EC6}' + . '\x{5EC7}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECB}\x{5ECC}\x{5ECD}\x{5ECE}\x{5ECF}' + . '\x{5ED0}\x{5ED1}\x{5ED2}\x{5ED3}\x{5ED4}\x{5ED5}\x{5ED6}\x{5ED7}\x{5ED8}' + . '\x{5ED9}\x{5EDA}\x{5EDB}\x{5EDC}\x{5EDD}\x{5EDE}\x{5EDF}\x{5EE0}\x{5EE1}' + . '\x{5EE2}\x{5EE3}\x{5EE4}\x{5EE5}\x{5EE6}\x{5EE7}\x{5EE8}\x{5EE9}\x{5EEA}' + . '\x{5EEC}\x{5EED}\x{5EEE}\x{5EEF}\x{5EF0}\x{5EF1}\x{5EF2}\x{5EF3}\x{5EF4}' + . '\x{5EF5}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}\x{5EFB}\x{5EFC}\x{5EFD}\x{5EFE}' + . '\x{5EFF}\x{5F00}\x{5F01}\x{5F02}\x{5F03}\x{5F04}\x{5F05}\x{5F06}\x{5F07}' + . '\x{5F08}\x{5F0A}\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F11}\x{5F12}\x{5F13}' + . '\x{5F14}\x{5F15}\x{5F16}\x{5F17}\x{5F18}\x{5F19}\x{5F1A}\x{5F1B}\x{5F1C}' + . '\x{5F1D}\x{5F1E}\x{5F1F}\x{5F20}\x{5F21}\x{5F22}\x{5F23}\x{5F24}\x{5F25}' + . '\x{5F26}\x{5F27}\x{5F28}\x{5F29}\x{5F2A}\x{5F2B}\x{5F2C}\x{5F2D}\x{5F2E}' + . '\x{5F2F}\x{5F30}\x{5F31}\x{5F32}\x{5F33}\x{5F34}\x{5F35}\x{5F36}\x{5F37}' + . '\x{5F38}\x{5F39}\x{5F3A}\x{5F3C}\x{5F3E}\x{5F3F}\x{5F40}\x{5F41}\x{5F42}' + . '\x{5F43}\x{5F44}\x{5F45}\x{5F46}\x{5F47}\x{5F48}\x{5F49}\x{5F4A}\x{5F4B}' + . '\x{5F4C}\x{5F4D}\x{5F4E}\x{5F4F}\x{5F50}\x{5F51}\x{5F52}\x{5F53}\x{5F54}' + . '\x{5F55}\x{5F56}\x{5F57}\x{5F58}\x{5F59}\x{5F5A}\x{5F5B}\x{5F5C}\x{5F5D}' + . '\x{5F5E}\x{5F5F}\x{5F60}\x{5F61}\x{5F62}\x{5F63}\x{5F64}\x{5F65}\x{5F66}' + . '\x{5F67}\x{5F68}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}\x{5F6D}\x{5F6E}\x{5F6F}' + . '\x{5F70}\x{5F71}\x{5F72}\x{5F73}\x{5F74}\x{5F75}\x{5F76}\x{5F77}\x{5F78}' + . '\x{5F79}\x{5F7A}\x{5F7B}\x{5F7C}\x{5F7D}\x{5F7E}\x{5F7F}\x{5F80}\x{5F81}' + . '\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F86}\x{5F87}\x{5F88}\x{5F89}\x{5F8A}' + . '\x{5F8B}\x{5F8C}\x{5F8D}\x{5F8E}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F94}' + . '\x{5F95}\x{5F96}\x{5F97}\x{5F98}\x{5F99}\x{5F9B}\x{5F9C}\x{5F9D}\x{5F9E}' + . '\x{5F9F}\x{5FA0}\x{5FA1}\x{5FA2}\x{5FA5}\x{5FA6}\x{5FA7}\x{5FA8}\x{5FA9}' + . '\x{5FAA}\x{5FAB}\x{5FAC}\x{5FAD}\x{5FAE}\x{5FAF}\x{5FB1}\x{5FB2}\x{5FB3}' + . '\x{5FB4}\x{5FB5}\x{5FB6}\x{5FB7}\x{5FB8}\x{5FB9}\x{5FBA}\x{5FBB}\x{5FBC}' + . '\x{5FBD}\x{5FBE}\x{5FBF}\x{5FC0}\x{5FC1}\x{5FC3}\x{5FC4}\x{5FC5}\x{5FC6}' + . '\x{5FC7}\x{5FC8}\x{5FC9}\x{5FCA}\x{5FCB}\x{5FCC}\x{5FCD}\x{5FCF}\x{5FD0}' + . '\x{5FD1}\x{5FD2}\x{5FD3}\x{5FD4}\x{5FD5}\x{5FD6}\x{5FD7}\x{5FD8}\x{5FD9}' + . '\x{5FDA}\x{5FDC}\x{5FDD}\x{5FDE}\x{5FE0}\x{5FE1}\x{5FE3}\x{5FE4}\x{5FE5}' + . '\x{5FE6}\x{5FE7}\x{5FE8}\x{5FE9}\x{5FEA}\x{5FEB}\x{5FED}\x{5FEE}\x{5FEF}' + . '\x{5FF0}\x{5FF1}\x{5FF2}\x{5FF3}\x{5FF4}\x{5FF5}\x{5FF6}\x{5FF7}\x{5FF8}' + . '\x{5FF9}\x{5FFA}\x{5FFB}\x{5FFD}\x{5FFE}\x{5FFF}\x{6000}\x{6001}\x{6002}' + . '\x{6003}\x{6004}\x{6005}\x{6006}\x{6007}\x{6008}\x{6009}\x{600A}\x{600B}' + . '\x{600C}\x{600D}\x{600E}\x{600F}\x{6010}\x{6011}\x{6012}\x{6013}\x{6014}' + . '\x{6015}\x{6016}\x{6017}\x{6018}\x{6019}\x{601A}\x{601B}\x{601C}\x{601D}' + . '\x{601E}\x{601F}\x{6020}\x{6021}\x{6022}\x{6024}\x{6025}\x{6026}\x{6027}' + . '\x{6028}\x{6029}\x{602A}\x{602B}\x{602C}\x{602D}\x{602E}\x{602F}\x{6030}' + . '\x{6031}\x{6032}\x{6033}\x{6034}\x{6035}\x{6036}\x{6037}\x{6038}\x{6039}' + . '\x{603A}\x{603B}\x{603C}\x{603D}\x{603E}\x{603F}\x{6040}\x{6041}\x{6042}' + . '\x{6043}\x{6044}\x{6045}\x{6046}\x{6047}\x{6048}\x{6049}\x{604A}\x{604B}' + . '\x{604C}\x{604D}\x{604E}\x{604F}\x{6050}\x{6051}\x{6052}\x{6053}\x{6054}' + . '\x{6055}\x{6057}\x{6058}\x{6059}\x{605A}\x{605B}\x{605C}\x{605D}\x{605E}' + . '\x{605F}\x{6062}\x{6063}\x{6064}\x{6065}\x{6066}\x{6067}\x{6068}\x{6069}' + . '\x{606A}\x{606B}\x{606C}\x{606D}\x{606E}\x{606F}\x{6070}\x{6072}\x{6073}' + . '\x{6075}\x{6076}\x{6077}\x{6078}\x{6079}\x{607A}\x{607B}\x{607C}\x{607D}' + . '\x{607E}\x{607F}\x{6080}\x{6081}\x{6082}\x{6083}\x{6084}\x{6085}\x{6086}' + . '\x{6087}\x{6088}\x{6089}\x{608A}\x{608B}\x{608C}\x{608D}\x{608E}\x{608F}' + . '\x{6090}\x{6092}\x{6094}\x{6095}\x{6096}\x{6097}\x{6098}\x{6099}\x{609A}' + . '\x{609B}\x{609C}\x{609D}\x{609E}\x{609F}\x{60A0}\x{60A1}\x{60A2}\x{60A3}' + . '\x{60A4}\x{60A6}\x{60A7}\x{60A8}\x{60AA}\x{60AB}\x{60AC}\x{60AD}\x{60AE}' + . '\x{60AF}\x{60B0}\x{60B1}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B7}' + . '\x{60B8}\x{60B9}\x{60BA}\x{60BB}\x{60BC}\x{60BD}\x{60BE}\x{60BF}\x{60C0}' + . '\x{60C1}\x{60C2}\x{60C3}\x{60C4}\x{60C5}\x{60C6}\x{60C7}\x{60C8}\x{60C9}' + . '\x{60CA}\x{60CB}\x{60CC}\x{60CD}\x{60CE}\x{60CF}\x{60D0}\x{60D1}\x{60D3}' + . '\x{60D4}\x{60D5}\x{60D7}\x{60D8}\x{60D9}\x{60DA}\x{60DB}\x{60DC}\x{60DD}' + . '\x{60DF}\x{60E0}\x{60E1}\x{60E2}\x{60E4}\x{60E6}\x{60E7}\x{60E8}\x{60E9}' + . '\x{60EA}\x{60EB}\x{60EC}\x{60ED}\x{60EE}\x{60EF}\x{60F0}\x{60F1}\x{60F2}' + . '\x{60F3}\x{60F4}\x{60F5}\x{60F6}\x{60F7}\x{60F8}\x{60F9}\x{60FA}\x{60FB}' + . '\x{60FC}\x{60FE}\x{60FF}\x{6100}\x{6101}\x{6103}\x{6104}\x{6105}\x{6106}' + . '\x{6108}\x{6109}\x{610A}\x{610B}\x{610C}\x{610D}\x{610E}\x{610F}\x{6110}' + . '\x{6112}\x{6113}\x{6114}\x{6115}\x{6116}\x{6117}\x{6118}\x{6119}\x{611A}' + . '\x{611B}\x{611C}\x{611D}\x{611F}\x{6120}\x{6122}\x{6123}\x{6124}\x{6125}' + . '\x{6126}\x{6127}\x{6128}\x{6129}\x{612A}\x{612B}\x{612C}\x{612D}\x{612E}' + . '\x{612F}\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}\x{613B}\x{613C}' + . '\x{613D}\x{613E}\x{613F}\x{6140}\x{6141}\x{6142}\x{6143}\x{6144}\x{6145}' + . '\x{6146}\x{6147}\x{6148}\x{6149}\x{614A}\x{614B}\x{614C}\x{614D}\x{614E}' + . '\x{614F}\x{6150}\x{6151}\x{6152}\x{6153}\x{6154}\x{6155}\x{6156}\x{6157}' + . '\x{6158}\x{6159}\x{615A}\x{615B}\x{615C}\x{615D}\x{615E}\x{615F}\x{6161}' + . '\x{6162}\x{6163}\x{6164}\x{6165}\x{6166}\x{6167}\x{6168}\x{6169}\x{616A}' + . '\x{616B}\x{616C}\x{616D}\x{616E}\x{6170}\x{6171}\x{6172}\x{6173}\x{6174}' + . '\x{6175}\x{6176}\x{6177}\x{6178}\x{6179}\x{617A}\x{617C}\x{617E}\x{6180}' + . '\x{6181}\x{6182}\x{6183}\x{6184}\x{6185}\x{6187}\x{6188}\x{6189}\x{618A}' + . '\x{618B}\x{618C}\x{618D}\x{618E}\x{618F}\x{6190}\x{6191}\x{6192}\x{6193}' + . '\x{6194}\x{6195}\x{6196}\x{6198}\x{6199}\x{619A}\x{619B}\x{619D}\x{619E}' + . '\x{619F}\x{61A0}\x{61A1}\x{61A2}\x{61A3}\x{61A4}\x{61A5}\x{61A6}\x{61A7}' + . '\x{61A8}\x{61A9}\x{61AA}\x{61AB}\x{61AC}\x{61AD}\x{61AE}\x{61AF}\x{61B0}' + . '\x{61B1}\x{61B2}\x{61B3}\x{61B4}\x{61B5}\x{61B6}\x{61B7}\x{61B8}\x{61BA}' + . '\x{61BC}\x{61BD}\x{61BE}\x{61BF}\x{61C0}\x{61C1}\x{61C2}\x{61C3}\x{61C4}' + . '\x{61C5}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' + . '\x{61CE}\x{61CF}\x{61D0}\x{61D1}\x{61D2}\x{61D4}\x{61D6}\x{61D7}\x{61D8}' + . '\x{61D9}\x{61DA}\x{61DB}\x{61DC}\x{61DD}\x{61DE}\x{61DF}\x{61E0}\x{61E1}' + . '\x{61E2}\x{61E3}\x{61E4}\x{61E5}\x{61E6}\x{61E7}\x{61E8}\x{61E9}\x{61EA}' + . '\x{61EB}\x{61ED}\x{61EE}\x{61F0}\x{61F1}\x{61F2}\x{61F3}\x{61F5}\x{61F6}' + . '\x{61F7}\x{61F8}\x{61F9}\x{61FA}\x{61FB}\x{61FC}\x{61FD}\x{61FE}\x{61FF}' + . '\x{6200}\x{6201}\x{6202}\x{6203}\x{6204}\x{6206}\x{6207}\x{6208}\x{6209}' + . '\x{620A}\x{620B}\x{620C}\x{620D}\x{620E}\x{620F}\x{6210}\x{6211}\x{6212}' + . '\x{6213}\x{6214}\x{6215}\x{6216}\x{6217}\x{6218}\x{6219}\x{621A}\x{621B}' + . '\x{621C}\x{621D}\x{621E}\x{621F}\x{6220}\x{6221}\x{6222}\x{6223}\x{6224}' + . '\x{6225}\x{6226}\x{6227}\x{6228}\x{6229}\x{622A}\x{622B}\x{622C}\x{622D}' + . '\x{622E}\x{622F}\x{6230}\x{6231}\x{6232}\x{6233}\x{6234}\x{6236}\x{6237}' + . '\x{6238}\x{623A}\x{623B}\x{623C}\x{623D}\x{623E}\x{623F}\x{6240}\x{6241}' + . '\x{6242}\x{6243}\x{6244}\x{6245}\x{6246}\x{6247}\x{6248}\x{6249}\x{624A}' + . '\x{624B}\x{624C}\x{624D}\x{624E}\x{624F}\x{6250}\x{6251}\x{6252}\x{6253}' + . '\x{6254}\x{6255}\x{6256}\x{6258}\x{6259}\x{625A}\x{625B}\x{625C}\x{625D}' + . '\x{625E}\x{625F}\x{6260}\x{6261}\x{6262}\x{6263}\x{6264}\x{6265}\x{6266}' + . '\x{6267}\x{6268}\x{6269}\x{626A}\x{626B}\x{626C}\x{626D}\x{626E}\x{626F}' + . '\x{6270}\x{6271}\x{6272}\x{6273}\x{6274}\x{6275}\x{6276}\x{6277}\x{6278}' + . '\x{6279}\x{627A}\x{627B}\x{627C}\x{627D}\x{627E}\x{627F}\x{6280}\x{6281}' + . '\x{6283}\x{6284}\x{6285}\x{6286}\x{6287}\x{6288}\x{6289}\x{628A}\x{628B}' + . '\x{628C}\x{628E}\x{628F}\x{6290}\x{6291}\x{6292}\x{6293}\x{6294}\x{6295}' + . '\x{6296}\x{6297}\x{6298}\x{6299}\x{629A}\x{629B}\x{629C}\x{629E}\x{629F}' + . '\x{62A0}\x{62A1}\x{62A2}\x{62A3}\x{62A4}\x{62A5}\x{62A7}\x{62A8}\x{62A9}' + . '\x{62AA}\x{62AB}\x{62AC}\x{62AD}\x{62AE}\x{62AF}\x{62B0}\x{62B1}\x{62B2}' + . '\x{62B3}\x{62B4}\x{62B5}\x{62B6}\x{62B7}\x{62B8}\x{62B9}\x{62BA}\x{62BB}' + . '\x{62BC}\x{62BD}\x{62BE}\x{62BF}\x{62C0}\x{62C1}\x{62C2}\x{62C3}\x{62C4}' + . '\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CB}\x{62CC}\x{62CD}' + . '\x{62CE}\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D5}\x{62D6}' + . '\x{62D7}\x{62D8}\x{62D9}\x{62DA}\x{62DB}\x{62DC}\x{62DD}\x{62DF}\x{62E0}' + . '\x{62E1}\x{62E2}\x{62E3}\x{62E4}\x{62E5}\x{62E6}\x{62E7}\x{62E8}\x{62E9}' + . '\x{62EB}\x{62EC}\x{62ED}\x{62EE}\x{62EF}\x{62F0}\x{62F1}\x{62F2}\x{62F3}' + . '\x{62F4}\x{62F5}\x{62F6}\x{62F7}\x{62F8}\x{62F9}\x{62FA}\x{62FB}\x{62FC}' + . '\x{62FD}\x{62FE}\x{62FF}\x{6300}\x{6301}\x{6302}\x{6303}\x{6304}\x{6305}' + . '\x{6306}\x{6307}\x{6308}\x{6309}\x{630B}\x{630C}\x{630D}\x{630E}\x{630F}' + . '\x{6310}\x{6311}\x{6312}\x{6313}\x{6314}\x{6315}\x{6316}\x{6318}\x{6319}' + . '\x{631A}\x{631B}\x{631C}\x{631D}\x{631E}\x{631F}\x{6320}\x{6321}\x{6322}' + . '\x{6323}\x{6324}\x{6325}\x{6326}\x{6327}\x{6328}\x{6329}\x{632A}\x{632B}' + . '\x{632C}\x{632D}\x{632E}\x{632F}\x{6330}\x{6332}\x{6333}\x{6334}\x{6336}' + . '\x{6338}\x{6339}\x{633A}\x{633B}\x{633C}\x{633D}\x{633E}\x{6340}\x{6341}' + . '\x{6342}\x{6343}\x{6344}\x{6345}\x{6346}\x{6347}\x{6348}\x{6349}\x{634A}' + . '\x{634B}\x{634C}\x{634D}\x{634E}\x{634F}\x{6350}\x{6351}\x{6352}\x{6353}' + . '\x{6354}\x{6355}\x{6356}\x{6357}\x{6358}\x{6359}\x{635A}\x{635C}\x{635D}' + . '\x{635E}\x{635F}\x{6360}\x{6361}\x{6362}\x{6363}\x{6364}\x{6365}\x{6366}' + . '\x{6367}\x{6368}\x{6369}\x{636A}\x{636B}\x{636C}\x{636D}\x{636E}\x{636F}' + . '\x{6370}\x{6371}\x{6372}\x{6373}\x{6374}\x{6375}\x{6376}\x{6377}\x{6378}' + . '\x{6379}\x{637A}\x{637B}\x{637C}\x{637D}\x{637E}\x{6380}\x{6381}\x{6382}' + . '\x{6383}\x{6384}\x{6385}\x{6386}\x{6387}\x{6388}\x{6389}\x{638A}\x{638C}' + . '\x{638D}\x{638E}\x{638F}\x{6390}\x{6391}\x{6392}\x{6394}\x{6395}\x{6396}' + . '\x{6397}\x{6398}\x{6399}\x{639A}\x{639B}\x{639C}\x{639D}\x{639E}\x{639F}' + . '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A4}\x{63A5}\x{63A6}\x{63A7}\x{63A8}' + . '\x{63A9}\x{63AA}\x{63AB}\x{63AC}\x{63AD}\x{63AE}\x{63AF}\x{63B0}\x{63B1}' + . '\x{63B2}\x{63B3}\x{63B4}\x{63B5}\x{63B6}\x{63B7}\x{63B8}\x{63B9}\x{63BA}' + . '\x{63BC}\x{63BD}\x{63BE}\x{63BF}\x{63C0}\x{63C1}\x{63C2}\x{63C3}\x{63C4}' + . '\x{63C5}\x{63C6}\x{63C7}\x{63C8}\x{63C9}\x{63CA}\x{63CB}\x{63CC}\x{63CD}' + . '\x{63CE}\x{63CF}\x{63D0}\x{63D2}\x{63D3}\x{63D4}\x{63D5}\x{63D6}\x{63D7}' + . '\x{63D8}\x{63D9}\x{63DA}\x{63DB}\x{63DC}\x{63DD}\x{63DE}\x{63DF}\x{63E0}' + . '\x{63E1}\x{63E2}\x{63E3}\x{63E4}\x{63E5}\x{63E6}\x{63E7}\x{63E8}\x{63E9}' + . '\x{63EA}\x{63EB}\x{63EC}\x{63ED}\x{63EE}\x{63EF}\x{63F0}\x{63F1}\x{63F2}' + . '\x{63F3}\x{63F4}\x{63F5}\x{63F6}\x{63F7}\x{63F8}\x{63F9}\x{63FA}\x{63FB}' + . '\x{63FC}\x{63FD}\x{63FE}\x{63FF}\x{6400}\x{6401}\x{6402}\x{6403}\x{6404}' + . '\x{6405}\x{6406}\x{6408}\x{6409}\x{640A}\x{640B}\x{640C}\x{640D}\x{640E}' + . '\x{640F}\x{6410}\x{6411}\x{6412}\x{6413}\x{6414}\x{6415}\x{6416}\x{6417}' + . '\x{6418}\x{6419}\x{641A}\x{641B}\x{641C}\x{641D}\x{641E}\x{641F}\x{6420}' + . '\x{6421}\x{6422}\x{6423}\x{6424}\x{6425}\x{6426}\x{6427}\x{6428}\x{6429}' + . '\x{642A}\x{642B}\x{642C}\x{642D}\x{642E}\x{642F}\x{6430}\x{6431}\x{6432}' + . '\x{6433}\x{6434}\x{6435}\x{6436}\x{6437}\x{6438}\x{6439}\x{643A}\x{643D}' + . '\x{643E}\x{643F}\x{6440}\x{6441}\x{6443}\x{6444}\x{6445}\x{6446}\x{6447}' + . '\x{6448}\x{644A}\x{644B}\x{644C}\x{644D}\x{644E}\x{644F}\x{6450}\x{6451}' + . '\x{6452}\x{6453}\x{6454}\x{6455}\x{6456}\x{6457}\x{6458}\x{6459}\x{645B}' + . '\x{645C}\x{645D}\x{645E}\x{645F}\x{6460}\x{6461}\x{6462}\x{6463}\x{6464}' + . '\x{6465}\x{6466}\x{6467}\x{6468}\x{6469}\x{646A}\x{646B}\x{646C}\x{646D}' + . '\x{646E}\x{646F}\x{6470}\x{6471}\x{6472}\x{6473}\x{6474}\x{6475}\x{6476}' + . '\x{6477}\x{6478}\x{6479}\x{647A}\x{647B}\x{647C}\x{647D}\x{647F}\x{6480}' + . '\x{6481}\x{6482}\x{6483}\x{6484}\x{6485}\x{6487}\x{6488}\x{6489}\x{648A}' + . '\x{648B}\x{648C}\x{648D}\x{648E}\x{648F}\x{6490}\x{6491}\x{6492}\x{6493}' + . '\x{6494}\x{6495}\x{6496}\x{6497}\x{6498}\x{6499}\x{649A}\x{649B}\x{649C}' + . '\x{649D}\x{649E}\x{649F}\x{64A0}\x{64A2}\x{64A3}\x{64A4}\x{64A5}\x{64A6}' + . '\x{64A7}\x{64A8}\x{64A9}\x{64AA}\x{64AB}\x{64AC}\x{64AD}\x{64AE}\x{64B0}' + . '\x{64B1}\x{64B2}\x{64B3}\x{64B4}\x{64B5}\x{64B7}\x{64B8}\x{64B9}\x{64BA}' + . '\x{64BB}\x{64BC}\x{64BD}\x{64BE}\x{64BF}\x{64C0}\x{64C1}\x{64C2}\x{64C3}' + . '\x{64C4}\x{64C5}\x{64C6}\x{64C7}\x{64C9}\x{64CA}\x{64CB}\x{64CC}\x{64CD}' + . '\x{64CE}\x{64CF}\x{64D0}\x{64D1}\x{64D2}\x{64D3}\x{64D4}\x{64D6}\x{64D7}' + . '\x{64D8}\x{64D9}\x{64DA}\x{64DB}\x{64DC}\x{64DD}\x{64DE}\x{64DF}\x{64E0}' + . '\x{64E2}\x{64E3}\x{64E4}\x{64E6}\x{64E7}\x{64E8}\x{64E9}\x{64EA}\x{64EB}' + . '\x{64EC}\x{64ED}\x{64EF}\x{64F0}\x{64F1}\x{64F2}\x{64F3}\x{64F4}\x{64F6}' + . '\x{64F7}\x{64F8}\x{64FA}\x{64FB}\x{64FC}\x{64FD}\x{64FE}\x{64FF}\x{6500}' + . '\x{6501}\x{6503}\x{6504}\x{6505}\x{6506}\x{6507}\x{6508}\x{6509}\x{650B}' + . '\x{650C}\x{650D}\x{650E}\x{650F}\x{6510}\x{6511}\x{6512}\x{6513}\x{6514}' + . '\x{6515}\x{6516}\x{6517}\x{6518}\x{6519}\x{651A}\x{651B}\x{651C}\x{651D}' + . '\x{651E}\x{6520}\x{6521}\x{6522}\x{6523}\x{6524}\x{6525}\x{6526}\x{6527}' + . '\x{6529}\x{652A}\x{652B}\x{652C}\x{652D}\x{652E}\x{652F}\x{6530}\x{6531}' + . '\x{6532}\x{6533}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}\x{653A}' + . '\x{653B}\x{653C}\x{653D}\x{653E}\x{653F}\x{6541}\x{6543}\x{6544}\x{6545}' + . '\x{6546}\x{6547}\x{6548}\x{6549}\x{654A}\x{654B}\x{654C}\x{654D}\x{654E}' + . '\x{654F}\x{6550}\x{6551}\x{6552}\x{6553}\x{6554}\x{6555}\x{6556}\x{6557}' + . '\x{6558}\x{6559}\x{655B}\x{655C}\x{655D}\x{655E}\x{6560}\x{6561}\x{6562}' + . '\x{6563}\x{6564}\x{6565}\x{6566}\x{6567}\x{6568}\x{6569}\x{656A}\x{656B}' + . '\x{656C}\x{656E}\x{656F}\x{6570}\x{6571}\x{6572}\x{6573}\x{6574}\x{6575}' + . '\x{6576}\x{6577}\x{6578}\x{6579}\x{657A}\x{657B}\x{657C}\x{657E}\x{657F}' + . '\x{6580}\x{6581}\x{6582}\x{6583}\x{6584}\x{6585}\x{6586}\x{6587}\x{6588}' + . '\x{6589}\x{658B}\x{658C}\x{658D}\x{658E}\x{658F}\x{6590}\x{6591}\x{6592}' + . '\x{6593}\x{6594}\x{6595}\x{6596}\x{6597}\x{6598}\x{6599}\x{659B}\x{659C}' + . '\x{659D}\x{659E}\x{659F}\x{65A0}\x{65A1}\x{65A2}\x{65A3}\x{65A4}\x{65A5}' + . '\x{65A6}\x{65A7}\x{65A8}\x{65A9}\x{65AA}\x{65AB}\x{65AC}\x{65AD}\x{65AE}' + . '\x{65AF}\x{65B0}\x{65B1}\x{65B2}\x{65B3}\x{65B4}\x{65B6}\x{65B7}\x{65B8}' + . '\x{65B9}\x{65BA}\x{65BB}\x{65BC}\x{65BD}\x{65BF}\x{65C0}\x{65C1}\x{65C2}' + . '\x{65C3}\x{65C4}\x{65C5}\x{65C6}\x{65C7}\x{65CA}\x{65CB}\x{65CC}\x{65CD}' + . '\x{65CE}\x{65CF}\x{65D0}\x{65D2}\x{65D3}\x{65D4}\x{65D5}\x{65D6}\x{65D7}' + . '\x{65DA}\x{65DB}\x{65DD}\x{65DE}\x{65DF}\x{65E0}\x{65E1}\x{65E2}\x{65E3}' + . '\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}\x{65EB}\x{65EC}\x{65ED}\x{65EE}' + . '\x{65EF}\x{65F0}\x{65F1}\x{65F2}\x{65F3}\x{65F4}\x{65F5}\x{65F6}\x{65F7}' + . '\x{65F8}\x{65FA}\x{65FB}\x{65FC}\x{65FD}\x{6600}\x{6601}\x{6602}\x{6603}' + . '\x{6604}\x{6605}\x{6606}\x{6607}\x{6608}\x{6609}\x{660A}\x{660B}\x{660C}' + . '\x{660D}\x{660E}\x{660F}\x{6610}\x{6611}\x{6612}\x{6613}\x{6614}\x{6615}' + . '\x{6616}\x{6618}\x{6619}\x{661A}\x{661B}\x{661C}\x{661D}\x{661F}\x{6620}' + . '\x{6621}\x{6622}\x{6623}\x{6624}\x{6625}\x{6626}\x{6627}\x{6628}\x{6629}' + . '\x{662A}\x{662B}\x{662D}\x{662E}\x{662F}\x{6630}\x{6631}\x{6632}\x{6633}' + . '\x{6634}\x{6635}\x{6636}\x{6639}\x{663A}\x{663C}\x{663D}\x{663E}\x{6640}' + . '\x{6641}\x{6642}\x{6643}\x{6644}\x{6645}\x{6646}\x{6647}\x{6649}\x{664A}' + . '\x{664B}\x{664C}\x{664E}\x{664F}\x{6650}\x{6651}\x{6652}\x{6653}\x{6654}' + . '\x{6655}\x{6656}\x{6657}\x{6658}\x{6659}\x{665A}\x{665B}\x{665C}\x{665D}' + . '\x{665E}\x{665F}\x{6661}\x{6662}\x{6664}\x{6665}\x{6666}\x{6668}\x{6669}' + . '\x{666A}\x{666B}\x{666C}\x{666D}\x{666E}\x{666F}\x{6670}\x{6671}\x{6672}' + . '\x{6673}\x{6674}\x{6675}\x{6676}\x{6677}\x{6678}\x{6679}\x{667A}\x{667B}' + . '\x{667C}\x{667D}\x{667E}\x{667F}\x{6680}\x{6681}\x{6682}\x{6683}\x{6684}' + . '\x{6685}\x{6686}\x{6687}\x{6688}\x{6689}\x{668A}\x{668B}\x{668C}\x{668D}' + . '\x{668E}\x{668F}\x{6690}\x{6691}\x{6693}\x{6694}\x{6695}\x{6696}\x{6697}' + . '\x{6698}\x{6699}\x{669A}\x{669B}\x{669D}\x{669F}\x{66A0}\x{66A1}\x{66A2}' + . '\x{66A3}\x{66A4}\x{66A5}\x{66A6}\x{66A7}\x{66A8}\x{66A9}\x{66AA}\x{66AB}' + . '\x{66AE}\x{66AF}\x{66B0}\x{66B1}\x{66B2}\x{66B3}\x{66B4}\x{66B5}\x{66B6}' + . '\x{66B7}\x{66B8}\x{66B9}\x{66BA}\x{66BB}\x{66BC}\x{66BD}\x{66BE}\x{66BF}' + . '\x{66C0}\x{66C1}\x{66C2}\x{66C3}\x{66C4}\x{66C5}\x{66C6}\x{66C7}\x{66C8}' + . '\x{66C9}\x{66CA}\x{66CB}\x{66CC}\x{66CD}\x{66CE}\x{66CF}\x{66D1}\x{66D2}' + . '\x{66D4}\x{66D5}\x{66D6}\x{66D8}\x{66D9}\x{66DA}\x{66DB}\x{66DC}\x{66DD}' + . '\x{66DE}\x{66E0}\x{66E1}\x{66E2}\x{66E3}\x{66E4}\x{66E5}\x{66E6}\x{66E7}' + . '\x{66E8}\x{66E9}\x{66EA}\x{66EB}\x{66EC}\x{66ED}\x{66EE}\x{66F0}\x{66F1}' + . '\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F6}\x{66F7}\x{66F8}\x{66F9}\x{66FA}' + . '\x{66FB}\x{66FC}\x{66FE}\x{66FF}\x{6700}\x{6701}\x{6703}\x{6704}\x{6705}' + . '\x{6706}\x{6708}\x{6709}\x{670A}\x{670B}\x{670C}\x{670D}\x{670E}\x{670F}' + . '\x{6710}\x{6711}\x{6712}\x{6713}\x{6714}\x{6715}\x{6716}\x{6717}\x{6718}' + . '\x{671A}\x{671B}\x{671C}\x{671D}\x{671E}\x{671F}\x{6720}\x{6721}\x{6722}' + . '\x{6723}\x{6725}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}\x{672D}' + . '\x{672E}\x{672F}\x{6730}\x{6731}\x{6732}\x{6733}\x{6734}\x{6735}\x{6736}' + . '\x{6737}\x{6738}\x{6739}\x{673A}\x{673B}\x{673C}\x{673D}\x{673E}\x{673F}' + . '\x{6740}\x{6741}\x{6742}\x{6743}\x{6744}\x{6745}\x{6746}\x{6747}\x{6748}' + . '\x{6749}\x{674A}\x{674B}\x{674C}\x{674D}\x{674E}\x{674F}\x{6750}\x{6751}' + . '\x{6752}\x{6753}\x{6754}\x{6755}\x{6756}\x{6757}\x{6758}\x{6759}\x{675A}' + . '\x{675B}\x{675C}\x{675D}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' + . '\x{6764}\x{6765}\x{6766}\x{6768}\x{6769}\x{676A}\x{676B}\x{676C}\x{676D}' + . '\x{676E}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}\x{6774}\x{6775}\x{6776}' + . '\x{6777}\x{6778}\x{6779}\x{677A}\x{677B}\x{677C}\x{677D}\x{677E}\x{677F}' + . '\x{6780}\x{6781}\x{6782}\x{6783}\x{6784}\x{6785}\x{6786}\x{6787}\x{6789}' + . '\x{678A}\x{678B}\x{678C}\x{678D}\x{678E}\x{678F}\x{6790}\x{6791}\x{6792}' + . '\x{6793}\x{6794}\x{6795}\x{6797}\x{6798}\x{6799}\x{679A}\x{679B}\x{679C}' + . '\x{679D}\x{679E}\x{679F}\x{67A0}\x{67A1}\x{67A2}\x{67A3}\x{67A4}\x{67A5}' + . '\x{67A6}\x{67A7}\x{67A8}\x{67AA}\x{67AB}\x{67AC}\x{67AD}\x{67AE}\x{67AF}' + . '\x{67B0}\x{67B1}\x{67B2}\x{67B3}\x{67B4}\x{67B5}\x{67B6}\x{67B7}\x{67B8}' + . '\x{67B9}\x{67BA}\x{67BB}\x{67BC}\x{67BE}\x{67C0}\x{67C1}\x{67C2}\x{67C3}' + . '\x{67C4}\x{67C5}\x{67C6}\x{67C7}\x{67C8}\x{67C9}\x{67CA}\x{67CB}\x{67CC}' + . '\x{67CD}\x{67CE}\x{67CF}\x{67D0}\x{67D1}\x{67D2}\x{67D3}\x{67D4}\x{67D6}' + . '\x{67D8}\x{67D9}\x{67DA}\x{67DB}\x{67DC}\x{67DD}\x{67DE}\x{67DF}\x{67E0}' + . '\x{67E1}\x{67E2}\x{67E3}\x{67E4}\x{67E5}\x{67E6}\x{67E7}\x{67E8}\x{67E9}' + . '\x{67EA}\x{67EB}\x{67EC}\x{67ED}\x{67EE}\x{67EF}\x{67F0}\x{67F1}\x{67F2}' + . '\x{67F3}\x{67F4}\x{67F5}\x{67F6}\x{67F7}\x{67F8}\x{67FA}\x{67FB}\x{67FC}' + . '\x{67FD}\x{67FE}\x{67FF}\x{6800}\x{6802}\x{6803}\x{6804}\x{6805}\x{6806}' + . '\x{6807}\x{6808}\x{6809}\x{680A}\x{680B}\x{680C}\x{680D}\x{680E}\x{680F}' + . '\x{6810}\x{6811}\x{6812}\x{6813}\x{6814}\x{6816}\x{6817}\x{6818}\x{6819}' + . '\x{681A}\x{681B}\x{681C}\x{681D}\x{681F}\x{6820}\x{6821}\x{6822}\x{6823}' + . '\x{6824}\x{6825}\x{6826}\x{6828}\x{6829}\x{682A}\x{682B}\x{682C}\x{682D}' + . '\x{682E}\x{682F}\x{6831}\x{6832}\x{6833}\x{6834}\x{6835}\x{6836}\x{6837}' + . '\x{6838}\x{6839}\x{683A}\x{683B}\x{683C}\x{683D}\x{683E}\x{683F}\x{6840}' + . '\x{6841}\x{6842}\x{6843}\x{6844}\x{6845}\x{6846}\x{6847}\x{6848}\x{6849}' + . '\x{684A}\x{684B}\x{684C}\x{684D}\x{684E}\x{684F}\x{6850}\x{6851}\x{6852}' + . '\x{6853}\x{6854}\x{6855}\x{6856}\x{6857}\x{685B}\x{685D}\x{6860}\x{6861}' + . '\x{6862}\x{6863}\x{6864}\x{6865}\x{6866}\x{6867}\x{6868}\x{6869}\x{686A}' + . '\x{686B}\x{686C}\x{686D}\x{686E}\x{686F}\x{6870}\x{6871}\x{6872}\x{6873}' + . '\x{6874}\x{6875}\x{6876}\x{6877}\x{6878}\x{6879}\x{687B}\x{687C}\x{687D}' + . '\x{687E}\x{687F}\x{6880}\x{6881}\x{6882}\x{6883}\x{6884}\x{6885}\x{6886}' + . '\x{6887}\x{6888}\x{6889}\x{688A}\x{688B}\x{688C}\x{688D}\x{688E}\x{688F}' + . '\x{6890}\x{6891}\x{6892}\x{6893}\x{6894}\x{6896}\x{6897}\x{6898}\x{689A}' + . '\x{689B}\x{689C}\x{689D}\x{689E}\x{689F}\x{68A0}\x{68A1}\x{68A2}\x{68A3}' + . '\x{68A4}\x{68A6}\x{68A7}\x{68A8}\x{68A9}\x{68AA}\x{68AB}\x{68AC}\x{68AD}' + . '\x{68AE}\x{68AF}\x{68B0}\x{68B1}\x{68B2}\x{68B3}\x{68B4}\x{68B5}\x{68B6}' + . '\x{68B7}\x{68B9}\x{68BB}\x{68BC}\x{68BD}\x{68BE}\x{68BF}\x{68C0}\x{68C1}' + . '\x{68C2}\x{68C4}\x{68C6}\x{68C7}\x{68C8}\x{68C9}\x{68CA}\x{68CB}\x{68CC}' + . '\x{68CD}\x{68CE}\x{68CF}\x{68D0}\x{68D1}\x{68D2}\x{68D3}\x{68D4}\x{68D5}' + . '\x{68D6}\x{68D7}\x{68D8}\x{68DA}\x{68DB}\x{68DC}\x{68DD}\x{68DE}\x{68DF}' + . '\x{68E0}\x{68E1}\x{68E3}\x{68E4}\x{68E6}\x{68E7}\x{68E8}\x{68E9}\x{68EA}' + . '\x{68EB}\x{68EC}\x{68ED}\x{68EE}\x{68EF}\x{68F0}\x{68F1}\x{68F2}\x{68F3}' + . '\x{68F4}\x{68F5}\x{68F6}\x{68F7}\x{68F8}\x{68F9}\x{68FA}\x{68FB}\x{68FC}' + . '\x{68FD}\x{68FE}\x{68FF}\x{6901}\x{6902}\x{6903}\x{6904}\x{6905}\x{6906}' + . '\x{6907}\x{6908}\x{690A}\x{690B}\x{690C}\x{690D}\x{690E}\x{690F}\x{6910}' + . '\x{6911}\x{6912}\x{6913}\x{6914}\x{6915}\x{6916}\x{6917}\x{6918}\x{6919}' + . '\x{691A}\x{691B}\x{691C}\x{691D}\x{691E}\x{691F}\x{6920}\x{6921}\x{6922}' + . '\x{6923}\x{6924}\x{6925}\x{6926}\x{6927}\x{6928}\x{6929}\x{692A}\x{692B}' + . '\x{692C}\x{692D}\x{692E}\x{692F}\x{6930}\x{6931}\x{6932}\x{6933}\x{6934}' + . '\x{6935}\x{6936}\x{6937}\x{6938}\x{6939}\x{693A}\x{693B}\x{693C}\x{693D}' + . '\x{693F}\x{6940}\x{6941}\x{6942}\x{6943}\x{6944}\x{6945}\x{6946}\x{6947}' + . '\x{6948}\x{6949}\x{694A}\x{694B}\x{694C}\x{694E}\x{694F}\x{6950}\x{6951}' + . '\x{6952}\x{6953}\x{6954}\x{6955}\x{6956}\x{6957}\x{6958}\x{6959}\x{695A}' + . '\x{695B}\x{695C}\x{695D}\x{695E}\x{695F}\x{6960}\x{6961}\x{6962}\x{6963}' + . '\x{6964}\x{6965}\x{6966}\x{6967}\x{6968}\x{6969}\x{696A}\x{696B}\x{696C}' + . '\x{696D}\x{696E}\x{696F}\x{6970}\x{6971}\x{6972}\x{6973}\x{6974}\x{6975}' + . '\x{6976}\x{6977}\x{6978}\x{6979}\x{697A}\x{697B}\x{697C}\x{697D}\x{697E}' + . '\x{697F}\x{6980}\x{6981}\x{6982}\x{6983}\x{6984}\x{6985}\x{6986}\x{6987}' + . '\x{6988}\x{6989}\x{698A}\x{698B}\x{698C}\x{698D}\x{698E}\x{698F}\x{6990}' + . '\x{6991}\x{6992}\x{6993}\x{6994}\x{6995}\x{6996}\x{6997}\x{6998}\x{6999}' + . '\x{699A}\x{699B}\x{699C}\x{699D}\x{699E}\x{69A0}\x{69A1}\x{69A3}\x{69A4}' + . '\x{69A5}\x{69A6}\x{69A7}\x{69A8}\x{69A9}\x{69AA}\x{69AB}\x{69AC}\x{69AD}' + . '\x{69AE}\x{69AF}\x{69B0}\x{69B1}\x{69B2}\x{69B3}\x{69B4}\x{69B5}\x{69B6}' + . '\x{69B7}\x{69B8}\x{69B9}\x{69BA}\x{69BB}\x{69BC}\x{69BD}\x{69BE}\x{69BF}' + . '\x{69C1}\x{69C2}\x{69C3}\x{69C4}\x{69C5}\x{69C6}\x{69C7}\x{69C8}\x{69C9}' + . '\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}\x{69CF}\x{69D0}\x{69D3}\x{69D4}' + . '\x{69D8}\x{69D9}\x{69DA}\x{69DB}\x{69DC}\x{69DD}\x{69DE}\x{69DF}\x{69E0}' + . '\x{69E1}\x{69E2}\x{69E3}\x{69E4}\x{69E5}\x{69E6}\x{69E7}\x{69E8}\x{69E9}' + . '\x{69EA}\x{69EB}\x{69EC}\x{69ED}\x{69EE}\x{69EF}\x{69F0}\x{69F1}\x{69F2}' + . '\x{69F3}\x{69F4}\x{69F5}\x{69F6}\x{69F7}\x{69F8}\x{69FA}\x{69FB}\x{69FC}' + . '\x{69FD}\x{69FE}\x{69FF}\x{6A00}\x{6A01}\x{6A02}\x{6A04}\x{6A05}\x{6A06}' + . '\x{6A07}\x{6A08}\x{6A09}\x{6A0A}\x{6A0B}\x{6A0D}\x{6A0E}\x{6A0F}\x{6A10}' + . '\x{6A11}\x{6A12}\x{6A13}\x{6A14}\x{6A15}\x{6A16}\x{6A17}\x{6A18}\x{6A19}' + . '\x{6A1A}\x{6A1B}\x{6A1D}\x{6A1E}\x{6A1F}\x{6A20}\x{6A21}\x{6A22}\x{6A23}' + . '\x{6A25}\x{6A26}\x{6A27}\x{6A28}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2C}\x{6A2D}' + . '\x{6A2E}\x{6A2F}\x{6A30}\x{6A31}\x{6A32}\x{6A33}\x{6A34}\x{6A35}\x{6A36}' + . '\x{6A38}\x{6A39}\x{6A3A}\x{6A3B}\x{6A3C}\x{6A3D}\x{6A3E}\x{6A3F}\x{6A40}' + . '\x{6A41}\x{6A42}\x{6A43}\x{6A44}\x{6A45}\x{6A46}\x{6A47}\x{6A48}\x{6A49}' + . '\x{6A4B}\x{6A4C}\x{6A4D}\x{6A4E}\x{6A4F}\x{6A50}\x{6A51}\x{6A52}\x{6A54}' + . '\x{6A55}\x{6A56}\x{6A57}\x{6A58}\x{6A59}\x{6A5A}\x{6A5B}\x{6A5D}\x{6A5E}' + . '\x{6A5F}\x{6A60}\x{6A61}\x{6A62}\x{6A63}\x{6A64}\x{6A65}\x{6A66}\x{6A67}' + . '\x{6A68}\x{6A69}\x{6A6A}\x{6A6B}\x{6A6C}\x{6A6D}\x{6A6F}\x{6A71}\x{6A72}' + . '\x{6A73}\x{6A74}\x{6A75}\x{6A76}\x{6A77}\x{6A78}\x{6A79}\x{6A7A}\x{6A7B}' + . '\x{6A7C}\x{6A7D}\x{6A7E}\x{6A7F}\x{6A80}\x{6A81}\x{6A82}\x{6A83}\x{6A84}' + . '\x{6A85}\x{6A87}\x{6A88}\x{6A89}\x{6A8B}\x{6A8C}\x{6A8D}\x{6A8E}\x{6A90}' + . '\x{6A91}\x{6A92}\x{6A93}\x{6A94}\x{6A95}\x{6A96}\x{6A97}\x{6A98}\x{6A9A}' + . '\x{6A9B}\x{6A9C}\x{6A9E}\x{6A9F}\x{6AA0}\x{6AA1}\x{6AA2}\x{6AA3}\x{6AA4}' + . '\x{6AA5}\x{6AA6}\x{6AA7}\x{6AA8}\x{6AA9}\x{6AAB}\x{6AAC}\x{6AAD}\x{6AAE}' + . '\x{6AAF}\x{6AB0}\x{6AB2}\x{6AB3}\x{6AB4}\x{6AB5}\x{6AB6}\x{6AB7}\x{6AB8}' + . '\x{6AB9}\x{6ABA}\x{6ABB}\x{6ABC}\x{6ABD}\x{6ABF}\x{6AC1}\x{6AC2}\x{6AC3}' + . '\x{6AC5}\x{6AC6}\x{6AC7}\x{6ACA}\x{6ACB}\x{6ACC}\x{6ACD}\x{6ACE}\x{6ACF}' + . '\x{6AD0}\x{6AD1}\x{6AD2}\x{6AD3}\x{6AD4}\x{6AD5}\x{6AD6}\x{6AD7}\x{6AD9}' + . '\x{6ADA}\x{6ADB}\x{6ADC}\x{6ADD}\x{6ADE}\x{6ADF}\x{6AE0}\x{6AE1}\x{6AE2}' + . '\x{6AE3}\x{6AE4}\x{6AE5}\x{6AE6}\x{6AE7}\x{6AE8}\x{6AEA}\x{6AEB}\x{6AEC}' + . '\x{6AED}\x{6AEE}\x{6AEF}\x{6AF0}\x{6AF1}\x{6AF2}\x{6AF3}\x{6AF4}\x{6AF5}' + . '\x{6AF6}\x{6AF7}\x{6AF8}\x{6AF9}\x{6AFA}\x{6AFB}\x{6AFC}\x{6AFD}\x{6AFE}' + . '\x{6AFF}\x{6B00}\x{6B01}\x{6B02}\x{6B03}\x{6B04}\x{6B05}\x{6B06}\x{6B07}' + . '\x{6B08}\x{6B09}\x{6B0A}\x{6B0B}\x{6B0C}\x{6B0D}\x{6B0F}\x{6B10}\x{6B11}' + . '\x{6B12}\x{6B13}\x{6B14}\x{6B15}\x{6B16}\x{6B17}\x{6B18}\x{6B19}\x{6B1A}' + . '\x{6B1C}\x{6B1D}\x{6B1E}\x{6B1F}\x{6B20}\x{6B21}\x{6B22}\x{6B23}\x{6B24}' + . '\x{6B25}\x{6B26}\x{6B27}\x{6B28}\x{6B29}\x{6B2A}\x{6B2B}\x{6B2C}\x{6B2D}' + . '\x{6B2F}\x{6B30}\x{6B31}\x{6B32}\x{6B33}\x{6B34}\x{6B36}\x{6B37}\x{6B38}' + . '\x{6B39}\x{6B3A}\x{6B3B}\x{6B3C}\x{6B3D}\x{6B3E}\x{6B3F}\x{6B41}\x{6B42}' + . '\x{6B43}\x{6B44}\x{6B45}\x{6B46}\x{6B47}\x{6B48}\x{6B49}\x{6B4A}\x{6B4B}' + . '\x{6B4C}\x{6B4D}\x{6B4E}\x{6B4F}\x{6B50}\x{6B51}\x{6B52}\x{6B53}\x{6B54}' + . '\x{6B55}\x{6B56}\x{6B59}\x{6B5A}\x{6B5B}\x{6B5C}\x{6B5E}\x{6B5F}\x{6B60}' + . '\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B65}\x{6B66}\x{6B67}\x{6B69}\x{6B6A}' + . '\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}\x{6B73}\x{6B74}\x{6B76}\x{6B77}' + . '\x{6B78}\x{6B79}\x{6B7A}\x{6B7B}\x{6B7C}\x{6B7E}\x{6B7F}\x{6B80}\x{6B81}' + . '\x{6B82}\x{6B83}\x{6B84}\x{6B85}\x{6B86}\x{6B87}\x{6B88}\x{6B89}\x{6B8A}' + . '\x{6B8B}\x{6B8C}\x{6B8D}\x{6B8E}\x{6B8F}\x{6B90}\x{6B91}\x{6B92}\x{6B93}' + . '\x{6B94}\x{6B95}\x{6B96}\x{6B97}\x{6B98}\x{6B99}\x{6B9A}\x{6B9B}\x{6B9C}' + . '\x{6B9D}\x{6B9E}\x{6B9F}\x{6BA0}\x{6BA1}\x{6BA2}\x{6BA3}\x{6BA4}\x{6BA5}' + . '\x{6BA6}\x{6BA7}\x{6BA8}\x{6BA9}\x{6BAA}\x{6BAB}\x{6BAC}\x{6BAD}\x{6BAE}' + . '\x{6BAF}\x{6BB0}\x{6BB2}\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB6}\x{6BB7}\x{6BB9}' + . '\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBD}\x{6BBE}\x{6BBF}\x{6BC0}\x{6BC1}\x{6BC2}' + . '\x{6BC3}\x{6BC4}\x{6BC5}\x{6BC6}\x{6BC7}\x{6BC8}\x{6BC9}\x{6BCA}\x{6BCB}' + . '\x{6BCC}\x{6BCD}\x{6BCE}\x{6BCF}\x{6BD0}\x{6BD1}\x{6BD2}\x{6BD3}\x{6BD4}' + . '\x{6BD5}\x{6BD6}\x{6BD7}\x{6BD8}\x{6BD9}\x{6BDA}\x{6BDB}\x{6BDC}\x{6BDD}' + . '\x{6BDE}\x{6BDF}\x{6BE0}\x{6BE1}\x{6BE2}\x{6BE3}\x{6BE4}\x{6BE5}\x{6BE6}' + . '\x{6BE7}\x{6BE8}\x{6BEA}\x{6BEB}\x{6BEC}\x{6BED}\x{6BEE}\x{6BEF}\x{6BF0}' + . '\x{6BF2}\x{6BF3}\x{6BF5}\x{6BF6}\x{6BF7}\x{6BF8}\x{6BF9}\x{6BFB}\x{6BFC}' + . '\x{6BFD}\x{6BFE}\x{6BFF}\x{6C00}\x{6C01}\x{6C02}\x{6C03}\x{6C04}\x{6C05}' + . '\x{6C06}\x{6C07}\x{6C08}\x{6C09}\x{6C0B}\x{6C0C}\x{6C0D}\x{6C0E}\x{6C0F}' + . '\x{6C10}\x{6C11}\x{6C12}\x{6C13}\x{6C14}\x{6C15}\x{6C16}\x{6C18}\x{6C19}' + . '\x{6C1A}\x{6C1B}\x{6C1D}\x{6C1E}\x{6C1F}\x{6C20}\x{6C21}\x{6C22}\x{6C23}' + . '\x{6C24}\x{6C25}\x{6C26}\x{6C27}\x{6C28}\x{6C29}\x{6C2A}\x{6C2B}\x{6C2C}' + . '\x{6C2E}\x{6C2F}\x{6C30}\x{6C31}\x{6C32}\x{6C33}\x{6C34}\x{6C35}\x{6C36}' + . '\x{6C37}\x{6C38}\x{6C3A}\x{6C3B}\x{6C3D}\x{6C3E}\x{6C3F}\x{6C40}\x{6C41}' + . '\x{6C42}\x{6C43}\x{6C44}\x{6C46}\x{6C47}\x{6C48}\x{6C49}\x{6C4A}\x{6C4B}' + . '\x{6C4C}\x{6C4D}\x{6C4E}\x{6C4F}\x{6C50}\x{6C51}\x{6C52}\x{6C53}\x{6C54}' + . '\x{6C55}\x{6C56}\x{6C57}\x{6C58}\x{6C59}\x{6C5A}\x{6C5B}\x{6C5C}\x{6C5D}' + . '\x{6C5E}\x{6C5F}\x{6C60}\x{6C61}\x{6C62}\x{6C63}\x{6C64}\x{6C65}\x{6C66}' + . '\x{6C67}\x{6C68}\x{6C69}\x{6C6A}\x{6C6B}\x{6C6D}\x{6C6F}\x{6C70}\x{6C71}' + . '\x{6C72}\x{6C73}\x{6C74}\x{6C75}\x{6C76}\x{6C77}\x{6C78}\x{6C79}\x{6C7A}' + . '\x{6C7B}\x{6C7C}\x{6C7D}\x{6C7E}\x{6C7F}\x{6C80}\x{6C81}\x{6C82}\x{6C83}' + . '\x{6C84}\x{6C85}\x{6C86}\x{6C87}\x{6C88}\x{6C89}\x{6C8A}\x{6C8B}\x{6C8C}' + . '\x{6C8D}\x{6C8E}\x{6C8F}\x{6C90}\x{6C91}\x{6C92}\x{6C93}\x{6C94}\x{6C95}' + . '\x{6C96}\x{6C97}\x{6C98}\x{6C99}\x{6C9A}\x{6C9B}\x{6C9C}\x{6C9D}\x{6C9E}' + . '\x{6C9F}\x{6CA1}\x{6CA2}\x{6CA3}\x{6CA4}\x{6CA5}\x{6CA6}\x{6CA7}\x{6CA8}' + . '\x{6CA9}\x{6CAA}\x{6CAB}\x{6CAC}\x{6CAD}\x{6CAE}\x{6CAF}\x{6CB0}\x{6CB1}' + . '\x{6CB2}\x{6CB3}\x{6CB4}\x{6CB5}\x{6CB6}\x{6CB7}\x{6CB8}\x{6CB9}\x{6CBA}' + . '\x{6CBB}\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC0}\x{6CC1}\x{6CC2}\x{6CC3}' + . '\x{6CC4}\x{6CC5}\x{6CC6}\x{6CC7}\x{6CC8}\x{6CC9}\x{6CCA}\x{6CCB}\x{6CCC}' + . '\x{6CCD}\x{6CCE}\x{6CCF}\x{6CD0}\x{6CD1}\x{6CD2}\x{6CD3}\x{6CD4}\x{6CD5}' + . '\x{6CD6}\x{6CD7}\x{6CD9}\x{6CDA}\x{6CDB}\x{6CDC}\x{6CDD}\x{6CDE}\x{6CDF}' + . '\x{6CE0}\x{6CE1}\x{6CE2}\x{6CE3}\x{6CE4}\x{6CE5}\x{6CE6}\x{6CE7}\x{6CE8}' + . '\x{6CE9}\x{6CEA}\x{6CEB}\x{6CEC}\x{6CED}\x{6CEE}\x{6CEF}\x{6CF0}\x{6CF1}' + . '\x{6CF2}\x{6CF3}\x{6CF5}\x{6CF6}\x{6CF7}\x{6CF8}\x{6CF9}\x{6CFA}\x{6CFB}' + . '\x{6CFC}\x{6CFD}\x{6CFE}\x{6CFF}\x{6D00}\x{6D01}\x{6D03}\x{6D04}\x{6D05}' + . '\x{6D06}\x{6D07}\x{6D08}\x{6D09}\x{6D0A}\x{6D0B}\x{6D0C}\x{6D0D}\x{6D0E}' + . '\x{6D0F}\x{6D10}\x{6D11}\x{6D12}\x{6D13}\x{6D14}\x{6D15}\x{6D16}\x{6D17}' + . '\x{6D18}\x{6D19}\x{6D1A}\x{6D1B}\x{6D1D}\x{6D1E}\x{6D1F}\x{6D20}\x{6D21}' + . '\x{6D22}\x{6D23}\x{6D25}\x{6D26}\x{6D27}\x{6D28}\x{6D29}\x{6D2A}\x{6D2B}' + . '\x{6D2C}\x{6D2D}\x{6D2E}\x{6D2F}\x{6D30}\x{6D31}\x{6D32}\x{6D33}\x{6D34}' + . '\x{6D35}\x{6D36}\x{6D37}\x{6D38}\x{6D39}\x{6D3A}\x{6D3B}\x{6D3C}\x{6D3D}' + . '\x{6D3E}\x{6D3F}\x{6D40}\x{6D41}\x{6D42}\x{6D43}\x{6D44}\x{6D45}\x{6D46}' + . '\x{6D47}\x{6D48}\x{6D49}\x{6D4A}\x{6D4B}\x{6D4C}\x{6D4D}\x{6D4E}\x{6D4F}' + . '\x{6D50}\x{6D51}\x{6D52}\x{6D53}\x{6D54}\x{6D55}\x{6D56}\x{6D57}\x{6D58}' + . '\x{6D59}\x{6D5A}\x{6D5B}\x{6D5C}\x{6D5D}\x{6D5E}\x{6D5F}\x{6D60}\x{6D61}' + . '\x{6D62}\x{6D63}\x{6D64}\x{6D65}\x{6D66}\x{6D67}\x{6D68}\x{6D69}\x{6D6A}' + . '\x{6D6B}\x{6D6C}\x{6D6D}\x{6D6E}\x{6D6F}\x{6D70}\x{6D72}\x{6D73}\x{6D74}' + . '\x{6D75}\x{6D76}\x{6D77}\x{6D78}\x{6D79}\x{6D7A}\x{6D7B}\x{6D7C}\x{6D7D}' + . '\x{6D7E}\x{6D7F}\x{6D80}\x{6D82}\x{6D83}\x{6D84}\x{6D85}\x{6D86}\x{6D87}' + . '\x{6D88}\x{6D89}\x{6D8A}\x{6D8B}\x{6D8C}\x{6D8D}\x{6D8E}\x{6D8F}\x{6D90}' + . '\x{6D91}\x{6D92}\x{6D93}\x{6D94}\x{6D95}\x{6D97}\x{6D98}\x{6D99}\x{6D9A}' + . '\x{6D9B}\x{6D9D}\x{6D9E}\x{6D9F}\x{6DA0}\x{6DA1}\x{6DA2}\x{6DA3}\x{6DA4}' + . '\x{6DA5}\x{6DA6}\x{6DA7}\x{6DA8}\x{6DA9}\x{6DAA}\x{6DAB}\x{6DAC}\x{6DAD}' + . '\x{6DAE}\x{6DAF}\x{6DB2}\x{6DB3}\x{6DB4}\x{6DB5}\x{6DB7}\x{6DB8}\x{6DB9}' + . '\x{6DBA}\x{6DBB}\x{6DBC}\x{6DBD}\x{6DBE}\x{6DBF}\x{6DC0}\x{6DC1}\x{6DC2}' + . '\x{6DC3}\x{6DC4}\x{6DC5}\x{6DC6}\x{6DC7}\x{6DC8}\x{6DC9}\x{6DCA}\x{6DCB}' + . '\x{6DCC}\x{6DCD}\x{6DCE}\x{6DCF}\x{6DD0}\x{6DD1}\x{6DD2}\x{6DD3}\x{6DD4}' + . '\x{6DD5}\x{6DD6}\x{6DD7}\x{6DD8}\x{6DD9}\x{6DDA}\x{6DDB}\x{6DDC}\x{6DDD}' + . '\x{6DDE}\x{6DDF}\x{6DE0}\x{6DE1}\x{6DE2}\x{6DE3}\x{6DE4}\x{6DE5}\x{6DE6}' + . '\x{6DE7}\x{6DE8}\x{6DE9}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DED}\x{6DEE}\x{6DEF}' + . '\x{6DF0}\x{6DF1}\x{6DF2}\x{6DF3}\x{6DF4}\x{6DF5}\x{6DF6}\x{6DF7}\x{6DF8}' + . '\x{6DF9}\x{6DFA}\x{6DFB}\x{6DFC}\x{6DFD}\x{6E00}\x{6E03}\x{6E04}\x{6E05}' + . '\x{6E07}\x{6E08}\x{6E09}\x{6E0A}\x{6E0B}\x{6E0C}\x{6E0D}\x{6E0E}\x{6E0F}' + . '\x{6E10}\x{6E11}\x{6E14}\x{6E15}\x{6E16}\x{6E17}\x{6E19}\x{6E1A}\x{6E1B}' + . '\x{6E1C}\x{6E1D}\x{6E1E}\x{6E1F}\x{6E20}\x{6E21}\x{6E22}\x{6E23}\x{6E24}' + . '\x{6E25}\x{6E26}\x{6E27}\x{6E28}\x{6E29}\x{6E2B}\x{6E2C}\x{6E2D}\x{6E2E}' + . '\x{6E2F}\x{6E30}\x{6E31}\x{6E32}\x{6E33}\x{6E34}\x{6E35}\x{6E36}\x{6E37}' + . '\x{6E38}\x{6E39}\x{6E3A}\x{6E3B}\x{6E3C}\x{6E3D}\x{6E3E}\x{6E3F}\x{6E40}' + . '\x{6E41}\x{6E42}\x{6E43}\x{6E44}\x{6E45}\x{6E46}\x{6E47}\x{6E48}\x{6E49}' + . '\x{6E4A}\x{6E4B}\x{6E4D}\x{6E4E}\x{6E4F}\x{6E50}\x{6E51}\x{6E52}\x{6E53}' + . '\x{6E54}\x{6E55}\x{6E56}\x{6E57}\x{6E58}\x{6E59}\x{6E5A}\x{6E5B}\x{6E5C}' + . '\x{6E5D}\x{6E5E}\x{6E5F}\x{6E60}\x{6E61}\x{6E62}\x{6E63}\x{6E64}\x{6E65}' + . '\x{6E66}\x{6E67}\x{6E68}\x{6E69}\x{6E6A}\x{6E6B}\x{6E6D}\x{6E6E}\x{6E6F}' + . '\x{6E70}\x{6E71}\x{6E72}\x{6E73}\x{6E74}\x{6E75}\x{6E77}\x{6E78}\x{6E79}' + . '\x{6E7E}\x{6E7F}\x{6E80}\x{6E81}\x{6E82}\x{6E83}\x{6E84}\x{6E85}\x{6E86}' + . '\x{6E87}\x{6E88}\x{6E89}\x{6E8A}\x{6E8D}\x{6E8E}\x{6E8F}\x{6E90}\x{6E91}' + . '\x{6E92}\x{6E93}\x{6E94}\x{6E96}\x{6E97}\x{6E98}\x{6E99}\x{6E9A}\x{6E9B}' + . '\x{6E9C}\x{6E9D}\x{6E9E}\x{6E9F}\x{6EA0}\x{6EA1}\x{6EA2}\x{6EA3}\x{6EA4}' + . '\x{6EA5}\x{6EA6}\x{6EA7}\x{6EA8}\x{6EA9}\x{6EAA}\x{6EAB}\x{6EAC}\x{6EAD}' + . '\x{6EAE}\x{6EAF}\x{6EB0}\x{6EB1}\x{6EB2}\x{6EB3}\x{6EB4}\x{6EB5}\x{6EB6}' + . '\x{6EB7}\x{6EB8}\x{6EB9}\x{6EBA}\x{6EBB}\x{6EBC}\x{6EBD}\x{6EBE}\x{6EBF}' + . '\x{6EC0}\x{6EC1}\x{6EC2}\x{6EC3}\x{6EC4}\x{6EC5}\x{6EC6}\x{6EC7}\x{6EC8}' + . '\x{6EC9}\x{6ECA}\x{6ECB}\x{6ECC}\x{6ECD}\x{6ECE}\x{6ECF}\x{6ED0}\x{6ED1}' + . '\x{6ED2}\x{6ED3}\x{6ED4}\x{6ED5}\x{6ED6}\x{6ED7}\x{6ED8}\x{6ED9}\x{6EDA}' + . '\x{6EDC}\x{6EDE}\x{6EDF}\x{6EE0}\x{6EE1}\x{6EE2}\x{6EE4}\x{6EE5}\x{6EE6}' + . '\x{6EE7}\x{6EE8}\x{6EE9}\x{6EEA}\x{6EEB}\x{6EEC}\x{6EED}\x{6EEE}\x{6EEF}' + . '\x{6EF0}\x{6EF1}\x{6EF2}\x{6EF3}\x{6EF4}\x{6EF5}\x{6EF6}\x{6EF7}\x{6EF8}' + . '\x{6EF9}\x{6EFA}\x{6EFB}\x{6EFC}\x{6EFD}\x{6EFE}\x{6EFF}\x{6F00}\x{6F01}' + . '\x{6F02}\x{6F03}\x{6F05}\x{6F06}\x{6F07}\x{6F08}\x{6F09}\x{6F0A}\x{6F0C}' + . '\x{6F0D}\x{6F0E}\x{6F0F}\x{6F10}\x{6F11}\x{6F12}\x{6F13}\x{6F14}\x{6F15}' + . '\x{6F16}\x{6F17}\x{6F18}\x{6F19}\x{6F1A}\x{6F1B}\x{6F1C}\x{6F1D}\x{6F1E}' + . '\x{6F1F}\x{6F20}\x{6F21}\x{6F22}\x{6F23}\x{6F24}\x{6F25}\x{6F26}\x{6F27}' + . '\x{6F28}\x{6F29}\x{6F2A}\x{6F2B}\x{6F2C}\x{6F2D}\x{6F2E}\x{6F2F}\x{6F30}' + . '\x{6F31}\x{6F32}\x{6F33}\x{6F34}\x{6F35}\x{6F36}\x{6F37}\x{6F38}\x{6F39}' + . '\x{6F3A}\x{6F3B}\x{6F3C}\x{6F3D}\x{6F3E}\x{6F3F}\x{6F40}\x{6F41}\x{6F43}' + . '\x{6F44}\x{6F45}\x{6F46}\x{6F47}\x{6F49}\x{6F4B}\x{6F4C}\x{6F4D}\x{6F4E}' + . '\x{6F4F}\x{6F50}\x{6F51}\x{6F52}\x{6F53}\x{6F54}\x{6F55}\x{6F56}\x{6F57}' + . '\x{6F58}\x{6F59}\x{6F5A}\x{6F5B}\x{6F5C}\x{6F5D}\x{6F5E}\x{6F5F}\x{6F60}' + . '\x{6F61}\x{6F62}\x{6F63}\x{6F64}\x{6F65}\x{6F66}\x{6F67}\x{6F68}\x{6F69}' + . '\x{6F6A}\x{6F6B}\x{6F6C}\x{6F6D}\x{6F6E}\x{6F6F}\x{6F70}\x{6F71}\x{6F72}' + . '\x{6F73}\x{6F74}\x{6F75}\x{6F76}\x{6F77}\x{6F78}\x{6F7A}\x{6F7B}\x{6F7C}' + . '\x{6F7D}\x{6F7E}\x{6F7F}\x{6F80}\x{6F81}\x{6F82}\x{6F83}\x{6F84}\x{6F85}' + . '\x{6F86}\x{6F87}\x{6F88}\x{6F89}\x{6F8A}\x{6F8B}\x{6F8C}\x{6F8D}\x{6F8E}' + . '\x{6F8F}\x{6F90}\x{6F91}\x{6F92}\x{6F93}\x{6F94}\x{6F95}\x{6F96}\x{6F97}' + . '\x{6F99}\x{6F9B}\x{6F9C}\x{6F9D}\x{6F9E}\x{6FA0}\x{6FA1}\x{6FA2}\x{6FA3}' + . '\x{6FA4}\x{6FA5}\x{6FA6}\x{6FA7}\x{6FA8}\x{6FA9}\x{6FAA}\x{6FAB}\x{6FAC}' + . '\x{6FAD}\x{6FAE}\x{6FAF}\x{6FB0}\x{6FB1}\x{6FB2}\x{6FB3}\x{6FB4}\x{6FB5}' + . '\x{6FB6}\x{6FB8}\x{6FB9}\x{6FBA}\x{6FBB}\x{6FBC}\x{6FBD}\x{6FBE}\x{6FBF}' + . '\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC4}\x{6FC6}\x{6FC7}\x{6FC8}\x{6FC9}' + . '\x{6FCA}\x{6FCB}\x{6FCC}\x{6FCD}\x{6FCE}\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}' + . '\x{6FD5}\x{6FD6}\x{6FD7}\x{6FD8}\x{6FD9}\x{6FDA}\x{6FDB}\x{6FDC}\x{6FDD}' + . '\x{6FDE}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE2}\x{6FE3}\x{6FE4}\x{6FE5}\x{6FE6}' + . '\x{6FE7}\x{6FE8}\x{6FE9}\x{6FEA}\x{6FEB}\x{6FEC}\x{6FED}\x{6FEE}\x{6FEF}' + . '\x{6FF0}\x{6FF1}\x{6FF2}\x{6FF3}\x{6FF4}\x{6FF6}\x{6FF7}\x{6FF8}\x{6FF9}' + . '\x{6FFA}\x{6FFB}\x{6FFC}\x{6FFE}\x{6FFF}\x{7000}\x{7001}\x{7002}\x{7003}' + . '\x{7004}\x{7005}\x{7006}\x{7007}\x{7008}\x{7009}\x{700A}\x{700B}\x{700C}' + . '\x{700D}\x{700E}\x{700F}\x{7011}\x{7012}\x{7014}\x{7015}\x{7016}\x{7017}' + . '\x{7018}\x{7019}\x{701A}\x{701B}\x{701C}\x{701D}\x{701F}\x{7020}\x{7021}' + . '\x{7022}\x{7023}\x{7024}\x{7025}\x{7026}\x{7027}\x{7028}\x{7029}\x{702A}' + . '\x{702B}\x{702C}\x{702D}\x{702E}\x{702F}\x{7030}\x{7031}\x{7032}\x{7033}' + . '\x{7034}\x{7035}\x{7036}\x{7037}\x{7038}\x{7039}\x{703A}\x{703B}\x{703C}' + . '\x{703D}\x{703E}\x{703F}\x{7040}\x{7041}\x{7042}\x{7043}\x{7044}\x{7045}' + . '\x{7046}\x{7048}\x{7049}\x{704A}\x{704C}\x{704D}\x{704F}\x{7050}\x{7051}' + . '\x{7052}\x{7053}\x{7054}\x{7055}\x{7056}\x{7057}\x{7058}\x{7059}\x{705A}' + . '\x{705B}\x{705C}\x{705D}\x{705E}\x{705F}\x{7060}\x{7061}\x{7062}\x{7063}' + . '\x{7064}\x{7065}\x{7066}\x{7067}\x{7068}\x{7069}\x{706A}\x{706B}\x{706C}' + . '\x{706D}\x{706E}\x{706F}\x{7070}\x{7071}\x{7074}\x{7075}\x{7076}\x{7077}' + . '\x{7078}\x{7079}\x{707A}\x{707C}\x{707D}\x{707E}\x{707F}\x{7080}\x{7082}' + . '\x{7083}\x{7084}\x{7085}\x{7086}\x{7087}\x{7088}\x{7089}\x{708A}\x{708B}' + . '\x{708C}\x{708E}\x{708F}\x{7090}\x{7091}\x{7092}\x{7093}\x{7094}\x{7095}' + . '\x{7096}\x{7098}\x{7099}\x{709A}\x{709C}\x{709D}\x{709E}\x{709F}\x{70A0}' + . '\x{70A1}\x{70A2}\x{70A3}\x{70A4}\x{70A5}\x{70A6}\x{70A7}\x{70A8}\x{70A9}' + . '\x{70AB}\x{70AC}\x{70AD}\x{70AE}\x{70AF}\x{70B0}\x{70B1}\x{70B3}\x{70B4}' + . '\x{70B5}\x{70B7}\x{70B8}\x{70B9}\x{70BA}\x{70BB}\x{70BC}\x{70BD}\x{70BE}' + . '\x{70BF}\x{70C0}\x{70C1}\x{70C2}\x{70C3}\x{70C4}\x{70C5}\x{70C6}\x{70C7}' + . '\x{70C8}\x{70C9}\x{70CA}\x{70CB}\x{70CC}\x{70CD}\x{70CE}\x{70CF}\x{70D0}' + . '\x{70D1}\x{70D2}\x{70D3}\x{70D4}\x{70D6}\x{70D7}\x{70D8}\x{70D9}\x{70DA}' + . '\x{70DB}\x{70DC}\x{70DD}\x{70DE}\x{70DF}\x{70E0}\x{70E1}\x{70E2}\x{70E3}' + . '\x{70E4}\x{70E5}\x{70E6}\x{70E7}\x{70E8}\x{70E9}\x{70EA}\x{70EB}\x{70EC}' + . '\x{70ED}\x{70EE}\x{70EF}\x{70F0}\x{70F1}\x{70F2}\x{70F3}\x{70F4}\x{70F5}' + . '\x{70F6}\x{70F7}\x{70F8}\x{70F9}\x{70FA}\x{70FB}\x{70FC}\x{70FD}\x{70FF}' + . '\x{7100}\x{7101}\x{7102}\x{7103}\x{7104}\x{7105}\x{7106}\x{7107}\x{7109}' + . '\x{710A}\x{710B}\x{710C}\x{710D}\x{710E}\x{710F}\x{7110}\x{7111}\x{7112}' + . '\x{7113}\x{7115}\x{7116}\x{7117}\x{7118}\x{7119}\x{711A}\x{711B}\x{711C}' + . '\x{711D}\x{711E}\x{711F}\x{7120}\x{7121}\x{7122}\x{7123}\x{7125}\x{7126}' + . '\x{7127}\x{7128}\x{7129}\x{712A}\x{712B}\x{712C}\x{712D}\x{712E}\x{712F}' + . '\x{7130}\x{7131}\x{7132}\x{7135}\x{7136}\x{7137}\x{7138}\x{7139}\x{713A}' + . '\x{713B}\x{713D}\x{713E}\x{713F}\x{7140}\x{7141}\x{7142}\x{7143}\x{7144}' + . '\x{7145}\x{7146}\x{7147}\x{7148}\x{7149}\x{714A}\x{714B}\x{714C}\x{714D}' + . '\x{714E}\x{714F}\x{7150}\x{7151}\x{7152}\x{7153}\x{7154}\x{7156}\x{7158}' + . '\x{7159}\x{715A}\x{715B}\x{715C}\x{715D}\x{715E}\x{715F}\x{7160}\x{7161}' + . '\x{7162}\x{7163}\x{7164}\x{7165}\x{7166}\x{7167}\x{7168}\x{7169}\x{716A}' + . '\x{716C}\x{716E}\x{716F}\x{7170}\x{7171}\x{7172}\x{7173}\x{7174}\x{7175}' + . '\x{7176}\x{7177}\x{7178}\x{7179}\x{717A}\x{717B}\x{717C}\x{717D}\x{717E}' + . '\x{717F}\x{7180}\x{7181}\x{7182}\x{7183}\x{7184}\x{7185}\x{7186}\x{7187}' + . '\x{7188}\x{7189}\x{718A}\x{718B}\x{718C}\x{718E}\x{718F}\x{7190}\x{7191}' + . '\x{7192}\x{7193}\x{7194}\x{7195}\x{7197}\x{7198}\x{7199}\x{719A}\x{719B}' + . '\x{719C}\x{719D}\x{719E}\x{719F}\x{71A0}\x{71A1}\x{71A2}\x{71A3}\x{71A4}' + . '\x{71A5}\x{71A7}\x{71A8}\x{71A9}\x{71AA}\x{71AC}\x{71AD}\x{71AE}\x{71AF}' + . '\x{71B0}\x{71B1}\x{71B2}\x{71B3}\x{71B4}\x{71B5}\x{71B7}\x{71B8}\x{71B9}' + . '\x{71BA}\x{71BB}\x{71BC}\x{71BD}\x{71BE}\x{71BF}\x{71C0}\x{71C1}\x{71C2}' + . '\x{71C3}\x{71C4}\x{71C5}\x{71C6}\x{71C7}\x{71C8}\x{71C9}\x{71CA}\x{71CB}' + . '\x{71CD}\x{71CE}\x{71CF}\x{71D0}\x{71D1}\x{71D2}\x{71D4}\x{71D5}\x{71D6}' + . '\x{71D7}\x{71D8}\x{71D9}\x{71DA}\x{71DB}\x{71DC}\x{71DD}\x{71DE}\x{71DF}' + . '\x{71E0}\x{71E1}\x{71E2}\x{71E3}\x{71E4}\x{71E5}\x{71E6}\x{71E7}\x{71E8}' + . '\x{71E9}\x{71EA}\x{71EB}\x{71EC}\x{71ED}\x{71EE}\x{71EF}\x{71F0}\x{71F1}' + . '\x{71F2}\x{71F4}\x{71F5}\x{71F6}\x{71F7}\x{71F8}\x{71F9}\x{71FB}\x{71FC}' + . '\x{71FD}\x{71FE}\x{71FF}\x{7201}\x{7202}\x{7203}\x{7204}\x{7205}\x{7206}' + . '\x{7207}\x{7208}\x{7209}\x{720A}\x{720C}\x{720D}\x{720E}\x{720F}\x{7210}' + . '\x{7212}\x{7213}\x{7214}\x{7216}\x{7218}\x{7219}\x{721A}\x{721B}\x{721C}' + . '\x{721D}\x{721E}\x{721F}\x{7221}\x{7222}\x{7223}\x{7226}\x{7227}\x{7228}' + . '\x{7229}\x{722A}\x{722B}\x{722C}\x{722D}\x{722E}\x{7230}\x{7231}\x{7232}' + . '\x{7233}\x{7235}\x{7236}\x{7237}\x{7238}\x{7239}\x{723A}\x{723B}\x{723C}' + . '\x{723D}\x{723E}\x{723F}\x{7240}\x{7241}\x{7242}\x{7243}\x{7244}\x{7246}' + . '\x{7247}\x{7248}\x{7249}\x{724A}\x{724B}\x{724C}\x{724D}\x{724F}\x{7251}' + . '\x{7252}\x{7253}\x{7254}\x{7256}\x{7257}\x{7258}\x{7259}\x{725A}\x{725B}' + . '\x{725C}\x{725D}\x{725E}\x{725F}\x{7260}\x{7261}\x{7262}\x{7263}\x{7264}' + . '\x{7265}\x{7266}\x{7267}\x{7268}\x{7269}\x{726A}\x{726B}\x{726C}\x{726D}' + . '\x{726E}\x{726F}\x{7270}\x{7271}\x{7272}\x{7273}\x{7274}\x{7275}\x{7276}' + . '\x{7277}\x{7278}\x{7279}\x{727A}\x{727B}\x{727C}\x{727D}\x{727E}\x{727F}' + . '\x{7280}\x{7281}\x{7282}\x{7283}\x{7284}\x{7285}\x{7286}\x{7287}\x{7288}' + . '\x{7289}\x{728A}\x{728B}\x{728C}\x{728D}\x{728E}\x{728F}\x{7290}\x{7291}' + . '\x{7292}\x{7293}\x{7294}\x{7295}\x{7296}\x{7297}\x{7298}\x{7299}\x{729A}' + . '\x{729B}\x{729C}\x{729D}\x{729E}\x{729F}\x{72A1}\x{72A2}\x{72A3}\x{72A4}' + . '\x{72A5}\x{72A6}\x{72A7}\x{72A8}\x{72A9}\x{72AA}\x{72AC}\x{72AD}\x{72AE}' + . '\x{72AF}\x{72B0}\x{72B1}\x{72B2}\x{72B3}\x{72B4}\x{72B5}\x{72B6}\x{72B7}' + . '\x{72B8}\x{72B9}\x{72BA}\x{72BB}\x{72BC}\x{72BD}\x{72BF}\x{72C0}\x{72C1}' + . '\x{72C2}\x{72C3}\x{72C4}\x{72C5}\x{72C6}\x{72C7}\x{72C8}\x{72C9}\x{72CA}' + . '\x{72CB}\x{72CC}\x{72CD}\x{72CE}\x{72CF}\x{72D0}\x{72D1}\x{72D2}\x{72D3}' + . '\x{72D4}\x{72D5}\x{72D6}\x{72D7}\x{72D8}\x{72D9}\x{72DA}\x{72DB}\x{72DC}' + . '\x{72DD}\x{72DE}\x{72DF}\x{72E0}\x{72E1}\x{72E2}\x{72E3}\x{72E4}\x{72E5}' + . '\x{72E6}\x{72E7}\x{72E8}\x{72E9}\x{72EA}\x{72EB}\x{72EC}\x{72ED}\x{72EE}' + . '\x{72EF}\x{72F0}\x{72F1}\x{72F2}\x{72F3}\x{72F4}\x{72F5}\x{72F6}\x{72F7}' + . '\x{72F8}\x{72F9}\x{72FA}\x{72FB}\x{72FC}\x{72FD}\x{72FE}\x{72FF}\x{7300}' + . '\x{7301}\x{7303}\x{7304}\x{7305}\x{7306}\x{7307}\x{7308}\x{7309}\x{730A}' + . '\x{730B}\x{730C}\x{730D}\x{730E}\x{730F}\x{7311}\x{7312}\x{7313}\x{7314}' + . '\x{7315}\x{7316}\x{7317}\x{7318}\x{7319}\x{731A}\x{731B}\x{731C}\x{731D}' + . '\x{731E}\x{7320}\x{7321}\x{7322}\x{7323}\x{7324}\x{7325}\x{7326}\x{7327}' + . '\x{7329}\x{732A}\x{732B}\x{732C}\x{732D}\x{732E}\x{7330}\x{7331}\x{7332}' + . '\x{7333}\x{7334}\x{7335}\x{7336}\x{7337}\x{7338}\x{7339}\x{733A}\x{733B}' + . '\x{733C}\x{733D}\x{733E}\x{733F}\x{7340}\x{7341}\x{7342}\x{7343}\x{7344}' + . '\x{7345}\x{7346}\x{7347}\x{7348}\x{7349}\x{734A}\x{734B}\x{734C}\x{734D}' + . '\x{734E}\x{7350}\x{7351}\x{7352}\x{7354}\x{7355}\x{7356}\x{7357}\x{7358}' + . '\x{7359}\x{735A}\x{735B}\x{735C}\x{735D}\x{735E}\x{735F}\x{7360}\x{7361}' + . '\x{7362}\x{7364}\x{7365}\x{7366}\x{7367}\x{7368}\x{7369}\x{736A}\x{736B}' + . '\x{736C}\x{736D}\x{736E}\x{736F}\x{7370}\x{7371}\x{7372}\x{7373}\x{7374}' + . '\x{7375}\x{7376}\x{7377}\x{7378}\x{7379}\x{737A}\x{737B}\x{737C}\x{737D}' + . '\x{737E}\x{737F}\x{7380}\x{7381}\x{7382}\x{7383}\x{7384}\x{7385}\x{7386}' + . '\x{7387}\x{7388}\x{7389}\x{738A}\x{738B}\x{738C}\x{738D}\x{738E}\x{738F}' + . '\x{7390}\x{7391}\x{7392}\x{7393}\x{7394}\x{7395}\x{7396}\x{7397}\x{7398}' + . '\x{7399}\x{739A}\x{739B}\x{739D}\x{739E}\x{739F}\x{73A0}\x{73A1}\x{73A2}' + . '\x{73A3}\x{73A4}\x{73A5}\x{73A6}\x{73A7}\x{73A8}\x{73A9}\x{73AA}\x{73AB}' + . '\x{73AC}\x{73AD}\x{73AE}\x{73AF}\x{73B0}\x{73B1}\x{73B2}\x{73B3}\x{73B4}' + . '\x{73B5}\x{73B6}\x{73B7}\x{73B8}\x{73B9}\x{73BA}\x{73BB}\x{73BC}\x{73BD}' + . '\x{73BE}\x{73BF}\x{73C0}\x{73C2}\x{73C3}\x{73C4}\x{73C5}\x{73C6}\x{73C7}' + . '\x{73C8}\x{73C9}\x{73CA}\x{73CB}\x{73CC}\x{73CD}\x{73CE}\x{73CF}\x{73D0}' + . '\x{73D1}\x{73D2}\x{73D3}\x{73D4}\x{73D5}\x{73D6}\x{73D7}\x{73D8}\x{73D9}' + . '\x{73DA}\x{73DB}\x{73DC}\x{73DD}\x{73DE}\x{73DF}\x{73E0}\x{73E2}\x{73E3}' + . '\x{73E5}\x{73E6}\x{73E7}\x{73E8}\x{73E9}\x{73EA}\x{73EB}\x{73EC}\x{73ED}' + . '\x{73EE}\x{73EF}\x{73F0}\x{73F1}\x{73F2}\x{73F4}\x{73F5}\x{73F6}\x{73F7}' + . '\x{73F8}\x{73F9}\x{73FA}\x{73FC}\x{73FD}\x{73FE}\x{73FF}\x{7400}\x{7401}' + . '\x{7402}\x{7403}\x{7404}\x{7405}\x{7406}\x{7407}\x{7408}\x{7409}\x{740A}' + . '\x{740B}\x{740C}\x{740D}\x{740E}\x{740F}\x{7410}\x{7411}\x{7412}\x{7413}' + . '\x{7414}\x{7415}\x{7416}\x{7417}\x{7419}\x{741A}\x{741B}\x{741C}\x{741D}' + . '\x{741E}\x{741F}\x{7420}\x{7421}\x{7422}\x{7423}\x{7424}\x{7425}\x{7426}' + . '\x{7427}\x{7428}\x{7429}\x{742A}\x{742B}\x{742C}\x{742D}\x{742E}\x{742F}' + . '\x{7430}\x{7431}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{7437}\x{7438}' + . '\x{743A}\x{743B}\x{743C}\x{743D}\x{743F}\x{7440}\x{7441}\x{7442}\x{7443}' + . '\x{7444}\x{7445}\x{7446}\x{7448}\x{744A}\x{744B}\x{744C}\x{744D}\x{744E}' + . '\x{744F}\x{7450}\x{7451}\x{7452}\x{7453}\x{7454}\x{7455}\x{7456}\x{7457}' + . '\x{7459}\x{745A}\x{745B}\x{745C}\x{745D}\x{745E}\x{745F}\x{7461}\x{7462}' + . '\x{7463}\x{7464}\x{7465}\x{7466}\x{7467}\x{7468}\x{7469}\x{746A}\x{746B}' + . '\x{746C}\x{746D}\x{746E}\x{746F}\x{7470}\x{7471}\x{7472}\x{7473}\x{7474}' + . '\x{7475}\x{7476}\x{7477}\x{7478}\x{7479}\x{747A}\x{747C}\x{747D}\x{747E}' + . '\x{747F}\x{7480}\x{7481}\x{7482}\x{7483}\x{7485}\x{7486}\x{7487}\x{7488}' + . '\x{7489}\x{748A}\x{748B}\x{748C}\x{748D}\x{748E}\x{748F}\x{7490}\x{7491}' + . '\x{7492}\x{7493}\x{7494}\x{7495}\x{7497}\x{7498}\x{7499}\x{749A}\x{749B}' + . '\x{749C}\x{749E}\x{749F}\x{74A0}\x{74A1}\x{74A3}\x{74A4}\x{74A5}\x{74A6}' + . '\x{74A7}\x{74A8}\x{74A9}\x{74AA}\x{74AB}\x{74AC}\x{74AD}\x{74AE}\x{74AF}' + . '\x{74B0}\x{74B1}\x{74B2}\x{74B3}\x{74B4}\x{74B5}\x{74B6}\x{74B7}\x{74B8}' + . '\x{74B9}\x{74BA}\x{74BB}\x{74BC}\x{74BD}\x{74BE}\x{74BF}\x{74C0}\x{74C1}' + . '\x{74C2}\x{74C3}\x{74C4}\x{74C5}\x{74C6}\x{74CA}\x{74CB}\x{74CD}\x{74CE}' + . '\x{74CF}\x{74D0}\x{74D1}\x{74D2}\x{74D3}\x{74D4}\x{74D5}\x{74D6}\x{74D7}' + . '\x{74D8}\x{74D9}\x{74DA}\x{74DB}\x{74DC}\x{74DD}\x{74DE}\x{74DF}\x{74E0}' + . '\x{74E1}\x{74E2}\x{74E3}\x{74E4}\x{74E5}\x{74E6}\x{74E7}\x{74E8}\x{74E9}' + . '\x{74EA}\x{74EC}\x{74ED}\x{74EE}\x{74EF}\x{74F0}\x{74F1}\x{74F2}\x{74F3}' + . '\x{74F4}\x{74F5}\x{74F6}\x{74F7}\x{74F8}\x{74F9}\x{74FA}\x{74FB}\x{74FC}' + . '\x{74FD}\x{74FE}\x{74FF}\x{7500}\x{7501}\x{7502}\x{7503}\x{7504}\x{7505}' + . '\x{7506}\x{7507}\x{7508}\x{7509}\x{750A}\x{750B}\x{750C}\x{750D}\x{750F}' + . '\x{7510}\x{7511}\x{7512}\x{7513}\x{7514}\x{7515}\x{7516}\x{7517}\x{7518}' + . '\x{7519}\x{751A}\x{751B}\x{751C}\x{751D}\x{751E}\x{751F}\x{7521}\x{7522}' + . '\x{7523}\x{7524}\x{7525}\x{7526}\x{7527}\x{7528}\x{7529}\x{752A}\x{752B}' + . '\x{752C}\x{752D}\x{752E}\x{752F}\x{7530}\x{7531}\x{7532}\x{7533}\x{7535}' + . '\x{7536}\x{7537}\x{7538}\x{7539}\x{753A}\x{753B}\x{753C}\x{753D}\x{753E}' + . '\x{753F}\x{7540}\x{7542}\x{7543}\x{7544}\x{7545}\x{7546}\x{7547}\x{7548}' + . '\x{7549}\x{754B}\x{754C}\x{754D}\x{754E}\x{754F}\x{7550}\x{7551}\x{7553}' + . '\x{7554}\x{7556}\x{7557}\x{7558}\x{7559}\x{755A}\x{755B}\x{755C}\x{755D}' + . '\x{755F}\x{7560}\x{7562}\x{7563}\x{7564}\x{7565}\x{7566}\x{7567}\x{7568}' + . '\x{7569}\x{756A}\x{756B}\x{756C}\x{756D}\x{756E}\x{756F}\x{7570}\x{7572}' + . '\x{7574}\x{7575}\x{7576}\x{7577}\x{7578}\x{7579}\x{757C}\x{757D}\x{757E}' + . '\x{757F}\x{7580}\x{7581}\x{7582}\x{7583}\x{7584}\x{7586}\x{7587}\x{7588}' + . '\x{7589}\x{758A}\x{758B}\x{758C}\x{758D}\x{758F}\x{7590}\x{7591}\x{7592}' + . '\x{7593}\x{7594}\x{7595}\x{7596}\x{7597}\x{7598}\x{7599}\x{759A}\x{759B}' + . '\x{759C}\x{759D}\x{759E}\x{759F}\x{75A0}\x{75A1}\x{75A2}\x{75A3}\x{75A4}' + . '\x{75A5}\x{75A6}\x{75A7}\x{75A8}\x{75AA}\x{75AB}\x{75AC}\x{75AD}\x{75AE}' + . '\x{75AF}\x{75B0}\x{75B1}\x{75B2}\x{75B3}\x{75B4}\x{75B5}\x{75B6}\x{75B8}' + . '\x{75B9}\x{75BA}\x{75BB}\x{75BC}\x{75BD}\x{75BE}\x{75BF}\x{75C0}\x{75C1}' + . '\x{75C2}\x{75C3}\x{75C4}\x{75C5}\x{75C6}\x{75C7}\x{75C8}\x{75C9}\x{75CA}' + . '\x{75CB}\x{75CC}\x{75CD}\x{75CE}\x{75CF}\x{75D0}\x{75D1}\x{75D2}\x{75D3}' + . '\x{75D4}\x{75D5}\x{75D6}\x{75D7}\x{75D8}\x{75D9}\x{75DA}\x{75DB}\x{75DD}' + . '\x{75DE}\x{75DF}\x{75E0}\x{75E1}\x{75E2}\x{75E3}\x{75E4}\x{75E5}\x{75E6}' + . '\x{75E7}\x{75E8}\x{75EA}\x{75EB}\x{75EC}\x{75ED}\x{75EF}\x{75F0}\x{75F1}' + . '\x{75F2}\x{75F3}\x{75F4}\x{75F5}\x{75F6}\x{75F7}\x{75F8}\x{75F9}\x{75FA}' + . '\x{75FB}\x{75FC}\x{75FD}\x{75FE}\x{75FF}\x{7600}\x{7601}\x{7602}\x{7603}' + . '\x{7604}\x{7605}\x{7606}\x{7607}\x{7608}\x{7609}\x{760A}\x{760B}\x{760C}' + . '\x{760D}\x{760E}\x{760F}\x{7610}\x{7611}\x{7612}\x{7613}\x{7614}\x{7615}' + . '\x{7616}\x{7617}\x{7618}\x{7619}\x{761A}\x{761B}\x{761C}\x{761D}\x{761E}' + . '\x{761F}\x{7620}\x{7621}\x{7622}\x{7623}\x{7624}\x{7625}\x{7626}\x{7627}' + . '\x{7628}\x{7629}\x{762A}\x{762B}\x{762D}\x{762E}\x{762F}\x{7630}\x{7631}' + . '\x{7632}\x{7633}\x{7634}\x{7635}\x{7636}\x{7637}\x{7638}\x{7639}\x{763A}' + . '\x{763B}\x{763C}\x{763D}\x{763E}\x{763F}\x{7640}\x{7641}\x{7642}\x{7643}' + . '\x{7646}\x{7647}\x{7648}\x{7649}\x{764A}\x{764B}\x{764C}\x{764D}\x{764F}' + . '\x{7650}\x{7652}\x{7653}\x{7654}\x{7656}\x{7657}\x{7658}\x{7659}\x{765A}' + . '\x{765B}\x{765C}\x{765D}\x{765E}\x{765F}\x{7660}\x{7661}\x{7662}\x{7663}' + . '\x{7664}\x{7665}\x{7666}\x{7667}\x{7668}\x{7669}\x{766A}\x{766B}\x{766C}' + . '\x{766D}\x{766E}\x{766F}\x{7670}\x{7671}\x{7672}\x{7674}\x{7675}\x{7676}' + . '\x{7677}\x{7678}\x{7679}\x{767B}\x{767C}\x{767D}\x{767E}\x{767F}\x{7680}' + . '\x{7681}\x{7682}\x{7683}\x{7684}\x{7685}\x{7686}\x{7687}\x{7688}\x{7689}' + . '\x{768A}\x{768B}\x{768C}\x{768E}\x{768F}\x{7690}\x{7691}\x{7692}\x{7693}' + . '\x{7694}\x{7695}\x{7696}\x{7697}\x{7698}\x{7699}\x{769A}\x{769B}\x{769C}' + . '\x{769D}\x{769E}\x{769F}\x{76A0}\x{76A3}\x{76A4}\x{76A6}\x{76A7}\x{76A9}' + . '\x{76AA}\x{76AB}\x{76AC}\x{76AD}\x{76AE}\x{76AF}\x{76B0}\x{76B1}\x{76B2}' + . '\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}\x{76BB}\x{76BC}\x{76BD}\x{76BE}' + . '\x{76BF}\x{76C0}\x{76C2}\x{76C3}\x{76C4}\x{76C5}\x{76C6}\x{76C7}\x{76C8}' + . '\x{76C9}\x{76CA}\x{76CD}\x{76CE}\x{76CF}\x{76D0}\x{76D1}\x{76D2}\x{76D3}' + . '\x{76D4}\x{76D5}\x{76D6}\x{76D7}\x{76D8}\x{76DA}\x{76DB}\x{76DC}\x{76DD}' + . '\x{76DE}\x{76DF}\x{76E0}\x{76E1}\x{76E2}\x{76E3}\x{76E4}\x{76E5}\x{76E6}' + . '\x{76E7}\x{76E8}\x{76E9}\x{76EA}\x{76EC}\x{76ED}\x{76EE}\x{76EF}\x{76F0}' + . '\x{76F1}\x{76F2}\x{76F3}\x{76F4}\x{76F5}\x{76F6}\x{76F7}\x{76F8}\x{76F9}' + . '\x{76FA}\x{76FB}\x{76FC}\x{76FD}\x{76FE}\x{76FF}\x{7701}\x{7703}\x{7704}' + . '\x{7705}\x{7706}\x{7707}\x{7708}\x{7709}\x{770A}\x{770B}\x{770C}\x{770D}' + . '\x{770F}\x{7710}\x{7711}\x{7712}\x{7713}\x{7714}\x{7715}\x{7716}\x{7717}' + . '\x{7718}\x{7719}\x{771A}\x{771B}\x{771C}\x{771D}\x{771E}\x{771F}\x{7720}' + . '\x{7722}\x{7723}\x{7725}\x{7726}\x{7727}\x{7728}\x{7729}\x{772A}\x{772C}' + . '\x{772D}\x{772E}\x{772F}\x{7730}\x{7731}\x{7732}\x{7733}\x{7734}\x{7735}' + . '\x{7736}\x{7737}\x{7738}\x{7739}\x{773A}\x{773B}\x{773C}\x{773D}\x{773E}' + . '\x{7740}\x{7741}\x{7743}\x{7744}\x{7745}\x{7746}\x{7747}\x{7748}\x{7749}' + . '\x{774A}\x{774B}\x{774C}\x{774D}\x{774E}\x{774F}\x{7750}\x{7751}\x{7752}' + . '\x{7753}\x{7754}\x{7755}\x{7756}\x{7757}\x{7758}\x{7759}\x{775A}\x{775B}' + . '\x{775C}\x{775D}\x{775E}\x{775F}\x{7760}\x{7761}\x{7762}\x{7763}\x{7765}' + . '\x{7766}\x{7767}\x{7768}\x{7769}\x{776A}\x{776B}\x{776C}\x{776D}\x{776E}' + . '\x{776F}\x{7770}\x{7771}\x{7772}\x{7773}\x{7774}\x{7775}\x{7776}\x{7777}' + . '\x{7778}\x{7779}\x{777A}\x{777B}\x{777C}\x{777D}\x{777E}\x{777F}\x{7780}' + . '\x{7781}\x{7782}\x{7783}\x{7784}\x{7785}\x{7786}\x{7787}\x{7788}\x{7789}' + . '\x{778A}\x{778B}\x{778C}\x{778D}\x{778E}\x{778F}\x{7790}\x{7791}\x{7792}' + . '\x{7793}\x{7794}\x{7795}\x{7797}\x{7798}\x{7799}\x{779A}\x{779B}\x{779C}' + . '\x{779D}\x{779E}\x{779F}\x{77A0}\x{77A1}\x{77A2}\x{77A3}\x{77A5}\x{77A6}' + . '\x{77A7}\x{77A8}\x{77A9}\x{77AA}\x{77AB}\x{77AC}\x{77AD}\x{77AE}\x{77AF}' + . '\x{77B0}\x{77B1}\x{77B2}\x{77B3}\x{77B4}\x{77B5}\x{77B6}\x{77B7}\x{77B8}' + . '\x{77B9}\x{77BA}\x{77BB}\x{77BC}\x{77BD}\x{77BF}\x{77C0}\x{77C2}\x{77C3}' + . '\x{77C4}\x{77C5}\x{77C6}\x{77C7}\x{77C8}\x{77C9}\x{77CA}\x{77CB}\x{77CC}' + . '\x{77CD}\x{77CE}\x{77CF}\x{77D0}\x{77D1}\x{77D3}\x{77D4}\x{77D5}\x{77D6}' + . '\x{77D7}\x{77D8}\x{77D9}\x{77DA}\x{77DB}\x{77DC}\x{77DE}\x{77DF}\x{77E0}' + . '\x{77E1}\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E8}\x{77E9}\x{77EA}\x{77EB}' + . '\x{77EC}\x{77ED}\x{77EE}\x{77EF}\x{77F0}\x{77F1}\x{77F2}\x{77F3}\x{77F6}' + . '\x{77F7}\x{77F8}\x{77F9}\x{77FA}\x{77FB}\x{77FC}\x{77FD}\x{77FE}\x{77FF}' + . '\x{7800}\x{7801}\x{7802}\x{7803}\x{7804}\x{7805}\x{7806}\x{7808}\x{7809}' + . '\x{780A}\x{780B}\x{780C}\x{780D}\x{780E}\x{780F}\x{7810}\x{7811}\x{7812}' + . '\x{7813}\x{7814}\x{7815}\x{7816}\x{7817}\x{7818}\x{7819}\x{781A}\x{781B}' + . '\x{781C}\x{781D}\x{781E}\x{781F}\x{7820}\x{7821}\x{7822}\x{7823}\x{7825}' + . '\x{7826}\x{7827}\x{7828}\x{7829}\x{782A}\x{782B}\x{782C}\x{782D}\x{782E}' + . '\x{782F}\x{7830}\x{7831}\x{7832}\x{7833}\x{7834}\x{7835}\x{7837}\x{7838}' + . '\x{7839}\x{783A}\x{783B}\x{783C}\x{783D}\x{783E}\x{7840}\x{7841}\x{7843}' + . '\x{7844}\x{7845}\x{7847}\x{7848}\x{7849}\x{784A}\x{784C}\x{784D}\x{784E}' + . '\x{7850}\x{7851}\x{7852}\x{7853}\x{7854}\x{7855}\x{7856}\x{7857}\x{7858}' + . '\x{7859}\x{785A}\x{785B}\x{785C}\x{785D}\x{785E}\x{785F}\x{7860}\x{7861}' + . '\x{7862}\x{7863}\x{7864}\x{7865}\x{7866}\x{7867}\x{7868}\x{7869}\x{786A}' + . '\x{786B}\x{786C}\x{786D}\x{786E}\x{786F}\x{7870}\x{7871}\x{7872}\x{7873}' + . '\x{7874}\x{7875}\x{7877}\x{7878}\x{7879}\x{787A}\x{787B}\x{787C}\x{787D}' + . '\x{787E}\x{787F}\x{7880}\x{7881}\x{7882}\x{7883}\x{7884}\x{7885}\x{7886}' + . '\x{7887}\x{7889}\x{788A}\x{788B}\x{788C}\x{788D}\x{788E}\x{788F}\x{7890}' + . '\x{7891}\x{7892}\x{7893}\x{7894}\x{7895}\x{7896}\x{7897}\x{7898}\x{7899}' + . '\x{789A}\x{789B}\x{789C}\x{789D}\x{789E}\x{789F}\x{78A0}\x{78A1}\x{78A2}' + . '\x{78A3}\x{78A4}\x{78A5}\x{78A6}\x{78A7}\x{78A8}\x{78A9}\x{78AA}\x{78AB}' + . '\x{78AC}\x{78AD}\x{78AE}\x{78AF}\x{78B0}\x{78B1}\x{78B2}\x{78B3}\x{78B4}' + . '\x{78B5}\x{78B6}\x{78B7}\x{78B8}\x{78B9}\x{78BA}\x{78BB}\x{78BC}\x{78BD}' + . '\x{78BE}\x{78BF}\x{78C0}\x{78C1}\x{78C3}\x{78C4}\x{78C5}\x{78C6}\x{78C8}' + . '\x{78C9}\x{78CA}\x{78CB}\x{78CC}\x{78CD}\x{78CE}\x{78CF}\x{78D0}\x{78D1}' + . '\x{78D3}\x{78D4}\x{78D5}\x{78D6}\x{78D7}\x{78D8}\x{78D9}\x{78DA}\x{78DB}' + . '\x{78DC}\x{78DD}\x{78DE}\x{78DF}\x{78E0}\x{78E1}\x{78E2}\x{78E3}\x{78E4}' + . '\x{78E5}\x{78E6}\x{78E7}\x{78E8}\x{78E9}\x{78EA}\x{78EB}\x{78EC}\x{78ED}' + . '\x{78EE}\x{78EF}\x{78F1}\x{78F2}\x{78F3}\x{78F4}\x{78F5}\x{78F6}\x{78F7}' + . '\x{78F9}\x{78FA}\x{78FB}\x{78FC}\x{78FD}\x{78FE}\x{78FF}\x{7901}\x{7902}' + . '\x{7903}\x{7904}\x{7905}\x{7906}\x{7907}\x{7909}\x{790A}\x{790B}\x{790C}' + . '\x{790E}\x{790F}\x{7910}\x{7911}\x{7912}\x{7913}\x{7914}\x{7916}\x{7917}' + . '\x{7918}\x{7919}\x{791A}\x{791B}\x{791C}\x{791D}\x{791E}\x{7921}\x{7922}' + . '\x{7923}\x{7924}\x{7925}\x{7926}\x{7927}\x{7928}\x{7929}\x{792A}\x{792B}' + . '\x{792C}\x{792D}\x{792E}\x{792F}\x{7930}\x{7931}\x{7933}\x{7934}\x{7935}' + . '\x{7937}\x{7938}\x{7939}\x{793A}\x{793B}\x{793C}\x{793D}\x{793E}\x{793F}' + . '\x{7940}\x{7941}\x{7942}\x{7943}\x{7944}\x{7945}\x{7946}\x{7947}\x{7948}' + . '\x{7949}\x{794A}\x{794B}\x{794C}\x{794D}\x{794E}\x{794F}\x{7950}\x{7951}' + . '\x{7952}\x{7953}\x{7954}\x{7955}\x{7956}\x{7957}\x{7958}\x{795A}\x{795B}' + . '\x{795C}\x{795D}\x{795E}\x{795F}\x{7960}\x{7961}\x{7962}\x{7963}\x{7964}' + . '\x{7965}\x{7966}\x{7967}\x{7968}\x{7969}\x{796A}\x{796B}\x{796D}\x{796F}' + . '\x{7970}\x{7971}\x{7972}\x{7973}\x{7974}\x{7977}\x{7978}\x{7979}\x{797A}' + . '\x{797B}\x{797C}\x{797D}\x{797E}\x{797F}\x{7980}\x{7981}\x{7982}\x{7983}' + . '\x{7984}\x{7985}\x{7988}\x{7989}\x{798A}\x{798B}\x{798C}\x{798D}\x{798E}' + . '\x{798F}\x{7990}\x{7991}\x{7992}\x{7993}\x{7994}\x{7995}\x{7996}\x{7997}' + . '\x{7998}\x{7999}\x{799A}\x{799B}\x{799C}\x{799F}\x{79A0}\x{79A1}\x{79A2}' + . '\x{79A3}\x{79A4}\x{79A5}\x{79A6}\x{79A7}\x{79A8}\x{79AA}\x{79AB}\x{79AC}' + . '\x{79AD}\x{79AE}\x{79AF}\x{79B0}\x{79B1}\x{79B2}\x{79B3}\x{79B4}\x{79B5}' + . '\x{79B6}\x{79B7}\x{79B8}\x{79B9}\x{79BA}\x{79BB}\x{79BD}\x{79BE}\x{79BF}' + . '\x{79C0}\x{79C1}\x{79C2}\x{79C3}\x{79C5}\x{79C6}\x{79C8}\x{79C9}\x{79CA}' + . '\x{79CB}\x{79CD}\x{79CE}\x{79CF}\x{79D0}\x{79D1}\x{79D2}\x{79D3}\x{79D5}' + . '\x{79D6}\x{79D8}\x{79D9}\x{79DA}\x{79DB}\x{79DC}\x{79DD}\x{79DE}\x{79DF}' + . '\x{79E0}\x{79E1}\x{79E2}\x{79E3}\x{79E4}\x{79E5}\x{79E6}\x{79E7}\x{79E8}' + . '\x{79E9}\x{79EA}\x{79EB}\x{79EC}\x{79ED}\x{79EE}\x{79EF}\x{79F0}\x{79F1}' + . '\x{79F2}\x{79F3}\x{79F4}\x{79F5}\x{79F6}\x{79F7}\x{79F8}\x{79F9}\x{79FA}' + . '\x{79FB}\x{79FC}\x{79FD}\x{79FE}\x{79FF}\x{7A00}\x{7A02}\x{7A03}\x{7A04}' + . '\x{7A05}\x{7A06}\x{7A08}\x{7A0A}\x{7A0B}\x{7A0C}\x{7A0D}\x{7A0E}\x{7A0F}' + . '\x{7A10}\x{7A11}\x{7A12}\x{7A13}\x{7A14}\x{7A15}\x{7A16}\x{7A17}\x{7A18}' + . '\x{7A19}\x{7A1A}\x{7A1B}\x{7A1C}\x{7A1D}\x{7A1E}\x{7A1F}\x{7A20}\x{7A21}' + . '\x{7A22}\x{7A23}\x{7A24}\x{7A25}\x{7A26}\x{7A27}\x{7A28}\x{7A29}\x{7A2A}' + . '\x{7A2B}\x{7A2D}\x{7A2E}\x{7A2F}\x{7A30}\x{7A31}\x{7A32}\x{7A33}\x{7A34}' + . '\x{7A35}\x{7A37}\x{7A39}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' + . '\x{7A41}\x{7A42}\x{7A43}\x{7A44}\x{7A45}\x{7A46}\x{7A47}\x{7A48}\x{7A49}' + . '\x{7A4A}\x{7A4B}\x{7A4C}\x{7A4D}\x{7A4E}\x{7A50}\x{7A51}\x{7A52}\x{7A53}' + . '\x{7A54}\x{7A55}\x{7A56}\x{7A57}\x{7A58}\x{7A59}\x{7A5A}\x{7A5B}\x{7A5C}' + . '\x{7A5D}\x{7A5E}\x{7A5F}\x{7A60}\x{7A61}\x{7A62}\x{7A65}\x{7A66}\x{7A67}' + . '\x{7A68}\x{7A69}\x{7A6B}\x{7A6C}\x{7A6D}\x{7A6E}\x{7A70}\x{7A71}\x{7A72}' + . '\x{7A73}\x{7A74}\x{7A75}\x{7A76}\x{7A77}\x{7A78}\x{7A79}\x{7A7A}\x{7A7B}' + . '\x{7A7C}\x{7A7D}\x{7A7E}\x{7A7F}\x{7A80}\x{7A81}\x{7A83}\x{7A84}\x{7A85}' + . '\x{7A86}\x{7A87}\x{7A88}\x{7A89}\x{7A8A}\x{7A8B}\x{7A8C}\x{7A8D}\x{7A8E}' + . '\x{7A8F}\x{7A90}\x{7A91}\x{7A92}\x{7A93}\x{7A94}\x{7A95}\x{7A96}\x{7A97}' + . '\x{7A98}\x{7A99}\x{7A9C}\x{7A9D}\x{7A9E}\x{7A9F}\x{7AA0}\x{7AA1}\x{7AA2}' + . '\x{7AA3}\x{7AA4}\x{7AA5}\x{7AA6}\x{7AA7}\x{7AA8}\x{7AA9}\x{7AAA}\x{7AAB}' + . '\x{7AAC}\x{7AAD}\x{7AAE}\x{7AAF}\x{7AB0}\x{7AB1}\x{7AB2}\x{7AB3}\x{7AB4}' + . '\x{7AB5}\x{7AB6}\x{7AB7}\x{7AB8}\x{7ABA}\x{7ABE}\x{7ABF}\x{7AC0}\x{7AC1}' + . '\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}\x{7AC9}\x{7ACA}\x{7ACB}\x{7ACC}\x{7ACD}' + . '\x{7ACE}\x{7ACF}\x{7AD0}\x{7AD1}\x{7AD2}\x{7AD3}\x{7AD4}\x{7AD5}\x{7AD6}' + . '\x{7AD8}\x{7AD9}\x{7ADB}\x{7ADC}\x{7ADD}\x{7ADE}\x{7ADF}\x{7AE0}\x{7AE1}' + . '\x{7AE2}\x{7AE3}\x{7AE4}\x{7AE5}\x{7AE6}\x{7AE7}\x{7AE8}\x{7AEA}\x{7AEB}' + . '\x{7AEC}\x{7AED}\x{7AEE}\x{7AEF}\x{7AF0}\x{7AF1}\x{7AF2}\x{7AF3}\x{7AF4}' + . '\x{7AF6}\x{7AF7}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFB}\x{7AFD}\x{7AFE}\x{7AFF}' + . '\x{7B00}\x{7B01}\x{7B02}\x{7B03}\x{7B04}\x{7B05}\x{7B06}\x{7B08}\x{7B09}' + . '\x{7B0A}\x{7B0B}\x{7B0C}\x{7B0D}\x{7B0E}\x{7B0F}\x{7B10}\x{7B11}\x{7B12}' + . '\x{7B13}\x{7B14}\x{7B15}\x{7B16}\x{7B17}\x{7B18}\x{7B19}\x{7B1A}\x{7B1B}' + . '\x{7B1C}\x{7B1D}\x{7B1E}\x{7B20}\x{7B21}\x{7B22}\x{7B23}\x{7B24}\x{7B25}' + . '\x{7B26}\x{7B28}\x{7B2A}\x{7B2B}\x{7B2C}\x{7B2D}\x{7B2E}\x{7B2F}\x{7B30}' + . '\x{7B31}\x{7B32}\x{7B33}\x{7B34}\x{7B35}\x{7B36}\x{7B37}\x{7B38}\x{7B39}' + . '\x{7B3A}\x{7B3B}\x{7B3C}\x{7B3D}\x{7B3E}\x{7B3F}\x{7B40}\x{7B41}\x{7B43}' + . '\x{7B44}\x{7B45}\x{7B46}\x{7B47}\x{7B48}\x{7B49}\x{7B4A}\x{7B4B}\x{7B4C}' + . '\x{7B4D}\x{7B4E}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B55}\x{7B56}' + . '\x{7B57}\x{7B58}\x{7B59}\x{7B5A}\x{7B5B}\x{7B5C}\x{7B5D}\x{7B5E}\x{7B5F}' + . '\x{7B60}\x{7B61}\x{7B62}\x{7B63}\x{7B64}\x{7B65}\x{7B66}\x{7B67}\x{7B68}' + . '\x{7B69}\x{7B6A}\x{7B6B}\x{7B6C}\x{7B6D}\x{7B6E}\x{7B70}\x{7B71}\x{7B72}' + . '\x{7B73}\x{7B74}\x{7B75}\x{7B76}\x{7B77}\x{7B78}\x{7B79}\x{7B7B}\x{7B7C}' + . '\x{7B7D}\x{7B7E}\x{7B7F}\x{7B80}\x{7B81}\x{7B82}\x{7B83}\x{7B84}\x{7B85}' + . '\x{7B87}\x{7B88}\x{7B89}\x{7B8A}\x{7B8B}\x{7B8C}\x{7B8D}\x{7B8E}\x{7B8F}' + . '\x{7B90}\x{7B91}\x{7B93}\x{7B94}\x{7B95}\x{7B96}\x{7B97}\x{7B98}\x{7B99}' + . '\x{7B9A}\x{7B9B}\x{7B9C}\x{7B9D}\x{7B9E}\x{7B9F}\x{7BA0}\x{7BA1}\x{7BA2}' + . '\x{7BA4}\x{7BA6}\x{7BA7}\x{7BA8}\x{7BA9}\x{7BAA}\x{7BAB}\x{7BAC}\x{7BAD}' + . '\x{7BAE}\x{7BAF}\x{7BB1}\x{7BB3}\x{7BB4}\x{7BB5}\x{7BB6}\x{7BB7}\x{7BB8}' + . '\x{7BB9}\x{7BBA}\x{7BBB}\x{7BBC}\x{7BBD}\x{7BBE}\x{7BBF}\x{7BC0}\x{7BC1}' + . '\x{7BC2}\x{7BC3}\x{7BC4}\x{7BC5}\x{7BC6}\x{7BC7}\x{7BC8}\x{7BC9}\x{7BCA}' + . '\x{7BCB}\x{7BCC}\x{7BCD}\x{7BCE}\x{7BD0}\x{7BD1}\x{7BD2}\x{7BD3}\x{7BD4}' + . '\x{7BD5}\x{7BD6}\x{7BD7}\x{7BD8}\x{7BD9}\x{7BDA}\x{7BDB}\x{7BDC}\x{7BDD}' + . '\x{7BDE}\x{7BDF}\x{7BE0}\x{7BE1}\x{7BE2}\x{7BE3}\x{7BE4}\x{7BE5}\x{7BE6}' + . '\x{7BE7}\x{7BE8}\x{7BE9}\x{7BEA}\x{7BEB}\x{7BEC}\x{7BED}\x{7BEE}\x{7BEF}' + . '\x{7BF0}\x{7BF1}\x{7BF2}\x{7BF3}\x{7BF4}\x{7BF5}\x{7BF6}\x{7BF7}\x{7BF8}' + . '\x{7BF9}\x{7BFB}\x{7BFC}\x{7BFD}\x{7BFE}\x{7BFF}\x{7C00}\x{7C01}\x{7C02}' + . '\x{7C03}\x{7C04}\x{7C05}\x{7C06}\x{7C07}\x{7C08}\x{7C09}\x{7C0A}\x{7C0B}' + . '\x{7C0C}\x{7C0D}\x{7C0E}\x{7C0F}\x{7C10}\x{7C11}\x{7C12}\x{7C13}\x{7C15}' + . '\x{7C16}\x{7C17}\x{7C18}\x{7C19}\x{7C1A}\x{7C1C}\x{7C1D}\x{7C1E}\x{7C1F}' + . '\x{7C20}\x{7C21}\x{7C22}\x{7C23}\x{7C24}\x{7C25}\x{7C26}\x{7C27}\x{7C28}' + . '\x{7C29}\x{7C2A}\x{7C2B}\x{7C2C}\x{7C2D}\x{7C30}\x{7C31}\x{7C32}\x{7C33}' + . '\x{7C34}\x{7C35}\x{7C36}\x{7C37}\x{7C38}\x{7C39}\x{7C3A}\x{7C3B}\x{7C3C}' + . '\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C41}\x{7C42}\x{7C43}\x{7C44}\x{7C45}' + . '\x{7C46}\x{7C47}\x{7C48}\x{7C49}\x{7C4A}\x{7C4B}\x{7C4C}\x{7C4D}\x{7C4E}' + . '\x{7C50}\x{7C51}\x{7C53}\x{7C54}\x{7C56}\x{7C57}\x{7C58}\x{7C59}\x{7C5A}' + . '\x{7C5B}\x{7C5C}\x{7C5E}\x{7C5F}\x{7C60}\x{7C61}\x{7C62}\x{7C63}\x{7C64}' + . '\x{7C65}\x{7C66}\x{7C67}\x{7C68}\x{7C69}\x{7C6A}\x{7C6B}\x{7C6C}\x{7C6D}' + . '\x{7C6E}\x{7C6F}\x{7C70}\x{7C71}\x{7C72}\x{7C73}\x{7C74}\x{7C75}\x{7C77}' + . '\x{7C78}\x{7C79}\x{7C7A}\x{7C7B}\x{7C7C}\x{7C7D}\x{7C7E}\x{7C7F}\x{7C80}' + . '\x{7C81}\x{7C82}\x{7C84}\x{7C85}\x{7C86}\x{7C88}\x{7C89}\x{7C8A}\x{7C8B}' + . '\x{7C8C}\x{7C8D}\x{7C8E}\x{7C8F}\x{7C90}\x{7C91}\x{7C92}\x{7C94}\x{7C95}' + . '\x{7C96}\x{7C97}\x{7C98}\x{7C99}\x{7C9B}\x{7C9C}\x{7C9D}\x{7C9E}\x{7C9F}' + . '\x{7CA0}\x{7CA1}\x{7CA2}\x{7CA3}\x{7CA4}\x{7CA5}\x{7CA6}\x{7CA7}\x{7CA8}' + . '\x{7CA9}\x{7CAA}\x{7CAD}\x{7CAE}\x{7CAF}\x{7CB0}\x{7CB1}\x{7CB2}\x{7CB3}' + . '\x{7CB4}\x{7CB5}\x{7CB6}\x{7CB7}\x{7CB8}\x{7CB9}\x{7CBA}\x{7CBB}\x{7CBC}' + . '\x{7CBD}\x{7CBE}\x{7CBF}\x{7CC0}\x{7CC1}\x{7CC2}\x{7CC3}\x{7CC4}\x{7CC5}' + . '\x{7CC6}\x{7CC7}\x{7CC8}\x{7CC9}\x{7CCA}\x{7CCB}\x{7CCC}\x{7CCD}\x{7CCE}' + . '\x{7CCF}\x{7CD0}\x{7CD1}\x{7CD2}\x{7CD4}\x{7CD5}\x{7CD6}\x{7CD7}\x{7CD8}' + . '\x{7CD9}\x{7CDC}\x{7CDD}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}' + . '\x{7CE8}\x{7CE9}\x{7CEA}\x{7CEB}\x{7CEC}\x{7CED}\x{7CEE}\x{7CEF}\x{7CF0}' + . '\x{7CF1}\x{7CF2}\x{7CF3}\x{7CF4}\x{7CF5}\x{7CF6}\x{7CF7}\x{7CF8}\x{7CF9}' + . '\x{7CFA}\x{7CFB}\x{7CFD}\x{7CFE}\x{7D00}\x{7D01}\x{7D02}\x{7D03}\x{7D04}' + . '\x{7D05}\x{7D06}\x{7D07}\x{7D08}\x{7D09}\x{7D0A}\x{7D0B}\x{7D0C}\x{7D0D}' + . '\x{7D0E}\x{7D0F}\x{7D10}\x{7D11}\x{7D12}\x{7D13}\x{7D14}\x{7D15}\x{7D16}' + . '\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D1D}\x{7D1E}\x{7D1F}' + . '\x{7D20}\x{7D21}\x{7D22}\x{7D24}\x{7D25}\x{7D26}\x{7D27}\x{7D28}\x{7D29}' + . '\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D31}\x{7D32}\x{7D33}\x{7D34}' + . '\x{7D35}\x{7D36}\x{7D37}\x{7D38}\x{7D39}\x{7D3A}\x{7D3B}\x{7D3C}\x{7D3D}' + . '\x{7D3E}\x{7D3F}\x{7D40}\x{7D41}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}' + . '\x{7D47}\x{7D49}\x{7D4A}\x{7D4B}\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D51}' + . '\x{7D52}\x{7D53}\x{7D54}\x{7D55}\x{7D56}\x{7D57}\x{7D58}\x{7D59}\x{7D5B}' + . '\x{7D5C}\x{7D5D}\x{7D5E}\x{7D5F}\x{7D60}\x{7D61}\x{7D62}\x{7D63}\x{7D65}' + . '\x{7D66}\x{7D67}\x{7D68}\x{7D69}\x{7D6A}\x{7D6B}\x{7D6C}\x{7D6D}\x{7D6E}' + . '\x{7D6F}\x{7D70}\x{7D71}\x{7D72}\x{7D73}\x{7D74}\x{7D75}\x{7D76}\x{7D77}' + . '\x{7D79}\x{7D7A}\x{7D7B}\x{7D7C}\x{7D7D}\x{7D7E}\x{7D7F}\x{7D80}\x{7D81}' + . '\x{7D83}\x{7D84}\x{7D85}\x{7D86}\x{7D87}\x{7D88}\x{7D89}\x{7D8A}\x{7D8B}' + . '\x{7D8C}\x{7D8D}\x{7D8E}\x{7D8F}\x{7D90}\x{7D91}\x{7D92}\x{7D93}\x{7D94}' + . '\x{7D96}\x{7D97}\x{7D99}\x{7D9B}\x{7D9C}\x{7D9D}\x{7D9E}\x{7D9F}\x{7DA0}' + . '\x{7DA1}\x{7DA2}\x{7DA3}\x{7DA5}\x{7DA6}\x{7DA7}\x{7DA9}\x{7DAA}\x{7DAB}' + . '\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}\x{7DB1}\x{7DB2}\x{7DB3}\x{7DB4}' + . '\x{7DB5}\x{7DB6}\x{7DB7}\x{7DB8}\x{7DB9}\x{7DBA}\x{7DBB}\x{7DBC}\x{7DBD}' + . '\x{7DBE}\x{7DBF}\x{7DC0}\x{7DC1}\x{7DC2}\x{7DC3}\x{7DC4}\x{7DC5}\x{7DC6}' + . '\x{7DC7}\x{7DC8}\x{7DC9}\x{7DCA}\x{7DCB}\x{7DCC}\x{7DCE}\x{7DCF}\x{7DD0}' + . '\x{7DD1}\x{7DD2}\x{7DD4}\x{7DD5}\x{7DD6}\x{7DD7}\x{7DD8}\x{7DD9}\x{7DDA}' + . '\x{7DDB}\x{7DDD}\x{7DDE}\x{7DDF}\x{7DE0}\x{7DE1}\x{7DE2}\x{7DE3}\x{7DE6}' + . '\x{7DE7}\x{7DE8}\x{7DE9}\x{7DEA}\x{7DEC}\x{7DED}\x{7DEE}\x{7DEF}\x{7DF0}' + . '\x{7DF1}\x{7DF2}\x{7DF3}\x{7DF4}\x{7DF5}\x{7DF6}\x{7DF7}\x{7DF8}\x{7DF9}' + . '\x{7DFA}\x{7DFB}\x{7DFC}\x{7E00}\x{7E01}\x{7E02}\x{7E03}\x{7E04}\x{7E05}' + . '\x{7E06}\x{7E07}\x{7E08}\x{7E09}\x{7E0A}\x{7E0B}\x{7E0C}\x{7E0D}\x{7E0E}' + . '\x{7E0F}\x{7E10}\x{7E11}\x{7E12}\x{7E13}\x{7E14}\x{7E15}\x{7E16}\x{7E17}' + . '\x{7E19}\x{7E1A}\x{7E1B}\x{7E1C}\x{7E1D}\x{7E1E}\x{7E1F}\x{7E20}\x{7E21}' + . '\x{7E22}\x{7E23}\x{7E24}\x{7E25}\x{7E26}\x{7E27}\x{7E28}\x{7E29}\x{7E2A}' + . '\x{7E2B}\x{7E2C}\x{7E2D}\x{7E2E}\x{7E2F}\x{7E30}\x{7E31}\x{7E32}\x{7E33}' + . '\x{7E34}\x{7E35}\x{7E36}\x{7E37}\x{7E38}\x{7E39}\x{7E3A}\x{7E3B}\x{7E3C}' + . '\x{7E3D}\x{7E3E}\x{7E3F}\x{7E40}\x{7E41}\x{7E42}\x{7E43}\x{7E44}\x{7E45}' + . '\x{7E46}\x{7E47}\x{7E48}\x{7E49}\x{7E4C}\x{7E4D}\x{7E4E}\x{7E4F}\x{7E50}' + . '\x{7E51}\x{7E52}\x{7E53}\x{7E54}\x{7E55}\x{7E56}\x{7E57}\x{7E58}\x{7E59}' + . '\x{7E5A}\x{7E5C}\x{7E5D}\x{7E5E}\x{7E5F}\x{7E60}\x{7E61}\x{7E62}\x{7E63}' + . '\x{7E65}\x{7E66}\x{7E67}\x{7E68}\x{7E69}\x{7E6A}\x{7E6B}\x{7E6C}\x{7E6D}' + . '\x{7E6E}\x{7E6F}\x{7E70}\x{7E71}\x{7E72}\x{7E73}\x{7E74}\x{7E75}\x{7E76}' + . '\x{7E77}\x{7E78}\x{7E79}\x{7E7A}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7E}\x{7E7F}' + . '\x{7E80}\x{7E81}\x{7E82}\x{7E83}\x{7E84}\x{7E85}\x{7E86}\x{7E87}\x{7E88}' + . '\x{7E89}\x{7E8A}\x{7E8B}\x{7E8C}\x{7E8D}\x{7E8E}\x{7E8F}\x{7E90}\x{7E91}' + . '\x{7E92}\x{7E93}\x{7E94}\x{7E95}\x{7E96}\x{7E97}\x{7E98}\x{7E99}\x{7E9A}' + . '\x{7E9B}\x{7E9C}\x{7E9E}\x{7E9F}\x{7EA0}\x{7EA1}\x{7EA2}\x{7EA3}\x{7EA4}' + . '\x{7EA5}\x{7EA6}\x{7EA7}\x{7EA8}\x{7EA9}\x{7EAA}\x{7EAB}\x{7EAC}\x{7EAD}' + . '\x{7EAE}\x{7EAF}\x{7EB0}\x{7EB1}\x{7EB2}\x{7EB3}\x{7EB4}\x{7EB5}\x{7EB6}' + . '\x{7EB7}\x{7EB8}\x{7EB9}\x{7EBA}\x{7EBB}\x{7EBC}\x{7EBD}\x{7EBE}\x{7EBF}' + . '\x{7EC0}\x{7EC1}\x{7EC2}\x{7EC3}\x{7EC4}\x{7EC5}\x{7EC6}\x{7EC7}\x{7EC8}' + . '\x{7EC9}\x{7ECA}\x{7ECB}\x{7ECC}\x{7ECD}\x{7ECE}\x{7ECF}\x{7ED0}\x{7ED1}' + . '\x{7ED2}\x{7ED3}\x{7ED4}\x{7ED5}\x{7ED6}\x{7ED7}\x{7ED8}\x{7ED9}\x{7EDA}' + . '\x{7EDB}\x{7EDC}\x{7EDD}\x{7EDE}\x{7EDF}\x{7EE0}\x{7EE1}\x{7EE2}\x{7EE3}' + . '\x{7EE4}\x{7EE5}\x{7EE6}\x{7EE7}\x{7EE8}\x{7EE9}\x{7EEA}\x{7EEB}\x{7EEC}' + . '\x{7EED}\x{7EEE}\x{7EEF}\x{7EF0}\x{7EF1}\x{7EF2}\x{7EF3}\x{7EF4}\x{7EF5}' + . '\x{7EF6}\x{7EF7}\x{7EF8}\x{7EF9}\x{7EFA}\x{7EFB}\x{7EFC}\x{7EFD}\x{7EFE}' + . '\x{7EFF}\x{7F00}\x{7F01}\x{7F02}\x{7F03}\x{7F04}\x{7F05}\x{7F06}\x{7F07}' + . '\x{7F08}\x{7F09}\x{7F0A}\x{7F0B}\x{7F0C}\x{7F0D}\x{7F0E}\x{7F0F}\x{7F10}' + . '\x{7F11}\x{7F12}\x{7F13}\x{7F14}\x{7F15}\x{7F16}\x{7F17}\x{7F18}\x{7F19}' + . '\x{7F1A}\x{7F1B}\x{7F1C}\x{7F1D}\x{7F1E}\x{7F1F}\x{7F20}\x{7F21}\x{7F22}' + . '\x{7F23}\x{7F24}\x{7F25}\x{7F26}\x{7F27}\x{7F28}\x{7F29}\x{7F2A}\x{7F2B}' + . '\x{7F2C}\x{7F2D}\x{7F2E}\x{7F2F}\x{7F30}\x{7F31}\x{7F32}\x{7F33}\x{7F34}' + . '\x{7F35}\x{7F36}\x{7F37}\x{7F38}\x{7F39}\x{7F3A}\x{7F3D}\x{7F3E}\x{7F3F}' + . '\x{7F40}\x{7F42}\x{7F43}\x{7F44}\x{7F45}\x{7F47}\x{7F48}\x{7F49}\x{7F4A}' + . '\x{7F4B}\x{7F4C}\x{7F4D}\x{7F4E}\x{7F4F}\x{7F50}\x{7F51}\x{7F52}\x{7F53}' + . '\x{7F54}\x{7F55}\x{7F56}\x{7F57}\x{7F58}\x{7F5A}\x{7F5B}\x{7F5C}\x{7F5D}' + . '\x{7F5E}\x{7F5F}\x{7F60}\x{7F61}\x{7F62}\x{7F63}\x{7F64}\x{7F65}\x{7F66}' + . '\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6C}\x{7F6D}\x{7F6E}\x{7F6F}' + . '\x{7F70}\x{7F71}\x{7F72}\x{7F73}\x{7F74}\x{7F75}\x{7F76}\x{7F77}\x{7F78}' + . '\x{7F79}\x{7F7A}\x{7F7B}\x{7F7C}\x{7F7D}\x{7F7E}\x{7F7F}\x{7F80}\x{7F81}' + . '\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}\x{7F88}\x{7F89}\x{7F8A}\x{7F8B}' + . '\x{7F8C}\x{7F8D}\x{7F8E}\x{7F8F}\x{7F91}\x{7F92}\x{7F93}\x{7F94}\x{7F95}' + . '\x{7F96}\x{7F98}\x{7F9A}\x{7F9B}\x{7F9C}\x{7F9D}\x{7F9E}\x{7F9F}\x{7FA0}' + . '\x{7FA1}\x{7FA2}\x{7FA3}\x{7FA4}\x{7FA5}\x{7FA6}\x{7FA7}\x{7FA8}\x{7FA9}' + . '\x{7FAA}\x{7FAB}\x{7FAC}\x{7FAD}\x{7FAE}\x{7FAF}\x{7FB0}\x{7FB1}\x{7FB2}' + . '\x{7FB3}\x{7FB5}\x{7FB6}\x{7FB7}\x{7FB8}\x{7FB9}\x{7FBA}\x{7FBB}\x{7FBC}' + . '\x{7FBD}\x{7FBE}\x{7FBF}\x{7FC0}\x{7FC1}\x{7FC2}\x{7FC3}\x{7FC4}\x{7FC5}' + . '\x{7FC6}\x{7FC7}\x{7FC8}\x{7FC9}\x{7FCA}\x{7FCB}\x{7FCC}\x{7FCD}\x{7FCE}' + . '\x{7FCF}\x{7FD0}\x{7FD1}\x{7FD2}\x{7FD3}\x{7FD4}\x{7FD5}\x{7FD7}\x{7FD8}' + . '\x{7FD9}\x{7FDA}\x{7FDB}\x{7FDC}\x{7FDE}\x{7FDF}\x{7FE0}\x{7FE1}\x{7FE2}' + . '\x{7FE3}\x{7FE5}\x{7FE6}\x{7FE7}\x{7FE8}\x{7FE9}\x{7FEA}\x{7FEB}\x{7FEC}' + . '\x{7FED}\x{7FEE}\x{7FEF}\x{7FF0}\x{7FF1}\x{7FF2}\x{7FF3}\x{7FF4}\x{7FF5}' + . '\x{7FF6}\x{7FF7}\x{7FF8}\x{7FF9}\x{7FFA}\x{7FFB}\x{7FFC}\x{7FFD}\x{7FFE}' + . '\x{7FFF}\x{8000}\x{8001}\x{8002}\x{8003}\x{8004}\x{8005}\x{8006}\x{8007}' + . '\x{8008}\x{8009}\x{800B}\x{800C}\x{800D}\x{800E}\x{800F}\x{8010}\x{8011}' + . '\x{8012}\x{8013}\x{8014}\x{8015}\x{8016}\x{8017}\x{8018}\x{8019}\x{801A}' + . '\x{801B}\x{801C}\x{801D}\x{801E}\x{801F}\x{8020}\x{8021}\x{8022}\x{8023}' + . '\x{8024}\x{8025}\x{8026}\x{8027}\x{8028}\x{8029}\x{802A}\x{802B}\x{802C}' + . '\x{802D}\x{802E}\x{8030}\x{8031}\x{8032}\x{8033}\x{8034}\x{8035}\x{8036}' + . '\x{8037}\x{8038}\x{8039}\x{803A}\x{803B}\x{803D}\x{803E}\x{803F}\x{8041}' + . '\x{8042}\x{8043}\x{8044}\x{8045}\x{8046}\x{8047}\x{8048}\x{8049}\x{804A}' + . '\x{804B}\x{804C}\x{804D}\x{804E}\x{804F}\x{8050}\x{8051}\x{8052}\x{8053}' + . '\x{8054}\x{8055}\x{8056}\x{8057}\x{8058}\x{8059}\x{805A}\x{805B}\x{805C}' + . '\x{805D}\x{805E}\x{805F}\x{8060}\x{8061}\x{8062}\x{8063}\x{8064}\x{8065}' + . '\x{8067}\x{8068}\x{8069}\x{806A}\x{806B}\x{806C}\x{806D}\x{806E}\x{806F}' + . '\x{8070}\x{8071}\x{8072}\x{8073}\x{8074}\x{8075}\x{8076}\x{8077}\x{8078}' + . '\x{8079}\x{807A}\x{807B}\x{807C}\x{807D}\x{807E}\x{807F}\x{8080}\x{8081}' + . '\x{8082}\x{8083}\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808A}\x{808B}' + . '\x{808C}\x{808D}\x{808F}\x{8090}\x{8091}\x{8092}\x{8093}\x{8095}\x{8096}' + . '\x{8097}\x{8098}\x{8099}\x{809A}\x{809B}\x{809C}\x{809D}\x{809E}\x{809F}' + . '\x{80A0}\x{80A1}\x{80A2}\x{80A3}\x{80A4}\x{80A5}\x{80A9}\x{80AA}\x{80AB}' + . '\x{80AD}\x{80AE}\x{80AF}\x{80B0}\x{80B1}\x{80B2}\x{80B4}\x{80B5}\x{80B6}' + . '\x{80B7}\x{80B8}\x{80BA}\x{80BB}\x{80BC}\x{80BD}\x{80BE}\x{80BF}\x{80C0}' + . '\x{80C1}\x{80C2}\x{80C3}\x{80C4}\x{80C5}\x{80C6}\x{80C7}\x{80C8}\x{80C9}' + . '\x{80CA}\x{80CB}\x{80CC}\x{80CD}\x{80CE}\x{80CF}\x{80D0}\x{80D1}\x{80D2}' + . '\x{80D3}\x{80D4}\x{80D5}\x{80D6}\x{80D7}\x{80D8}\x{80D9}\x{80DA}\x{80DB}' + . '\x{80DC}\x{80DD}\x{80DE}\x{80E0}\x{80E1}\x{80E2}\x{80E3}\x{80E4}\x{80E5}' + . '\x{80E6}\x{80E7}\x{80E8}\x{80E9}\x{80EA}\x{80EB}\x{80EC}\x{80ED}\x{80EE}' + . '\x{80EF}\x{80F0}\x{80F1}\x{80F2}\x{80F3}\x{80F4}\x{80F5}\x{80F6}\x{80F7}' + . '\x{80F8}\x{80F9}\x{80FA}\x{80FB}\x{80FC}\x{80FD}\x{80FE}\x{80FF}\x{8100}' + . '\x{8101}\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{810B}' + . '\x{810C}\x{810D}\x{810E}\x{810F}\x{8110}\x{8111}\x{8112}\x{8113}\x{8114}' + . '\x{8115}\x{8116}\x{8118}\x{8119}\x{811A}\x{811B}\x{811C}\x{811D}\x{811E}' + . '\x{811F}\x{8120}\x{8121}\x{8122}\x{8123}\x{8124}\x{8125}\x{8126}\x{8127}' + . '\x{8128}\x{8129}\x{812A}\x{812B}\x{812C}\x{812D}\x{812E}\x{812F}\x{8130}' + . '\x{8131}\x{8132}\x{8136}\x{8137}\x{8138}\x{8139}\x{813A}\x{813B}\x{813C}' + . '\x{813D}\x{813E}\x{813F}\x{8140}\x{8141}\x{8142}\x{8143}\x{8144}\x{8145}' + . '\x{8146}\x{8147}\x{8148}\x{8149}\x{814A}\x{814B}\x{814C}\x{814D}\x{814E}' + . '\x{814F}\x{8150}\x{8151}\x{8152}\x{8153}\x{8154}\x{8155}\x{8156}\x{8157}' + . '\x{8158}\x{8159}\x{815A}\x{815B}\x{815C}\x{815D}\x{815E}\x{8160}\x{8161}' + . '\x{8162}\x{8163}\x{8164}\x{8165}\x{8166}\x{8167}\x{8168}\x{8169}\x{816A}' + . '\x{816B}\x{816C}\x{816D}\x{816E}\x{816F}\x{8170}\x{8171}\x{8172}\x{8173}' + . '\x{8174}\x{8175}\x{8176}\x{8177}\x{8178}\x{8179}\x{817A}\x{817B}\x{817C}' + . '\x{817D}\x{817E}\x{817F}\x{8180}\x{8181}\x{8182}\x{8183}\x{8185}\x{8186}' + . '\x{8187}\x{8188}\x{8189}\x{818A}\x{818B}\x{818C}\x{818D}\x{818E}\x{818F}' + . '\x{8191}\x{8192}\x{8193}\x{8194}\x{8195}\x{8197}\x{8198}\x{8199}\x{819A}' + . '\x{819B}\x{819C}\x{819D}\x{819E}\x{819F}\x{81A0}\x{81A1}\x{81A2}\x{81A3}' + . '\x{81A4}\x{81A5}\x{81A6}\x{81A7}\x{81A8}\x{81A9}\x{81AA}\x{81AB}\x{81AC}' + . '\x{81AD}\x{81AE}\x{81AF}\x{81B0}\x{81B1}\x{81B2}\x{81B3}\x{81B4}\x{81B5}' + . '\x{81B6}\x{81B7}\x{81B8}\x{81B9}\x{81BA}\x{81BB}\x{81BC}\x{81BD}\x{81BE}' + . '\x{81BF}\x{81C0}\x{81C1}\x{81C2}\x{81C3}\x{81C4}\x{81C5}\x{81C6}\x{81C7}' + . '\x{81C8}\x{81C9}\x{81CA}\x{81CC}\x{81CD}\x{81CE}\x{81CF}\x{81D0}\x{81D1}' + . '\x{81D2}\x{81D4}\x{81D5}\x{81D6}\x{81D7}\x{81D8}\x{81D9}\x{81DA}\x{81DB}' + . '\x{81DC}\x{81DD}\x{81DE}\x{81DF}\x{81E0}\x{81E1}\x{81E2}\x{81E3}\x{81E5}' + . '\x{81E6}\x{81E7}\x{81E8}\x{81E9}\x{81EA}\x{81EB}\x{81EC}\x{81ED}\x{81EE}' + . '\x{81F1}\x{81F2}\x{81F3}\x{81F4}\x{81F5}\x{81F6}\x{81F7}\x{81F8}\x{81F9}' + . '\x{81FA}\x{81FB}\x{81FC}\x{81FD}\x{81FE}\x{81FF}\x{8200}\x{8201}\x{8202}' + . '\x{8203}\x{8204}\x{8205}\x{8206}\x{8207}\x{8208}\x{8209}\x{820A}\x{820B}' + . '\x{820C}\x{820D}\x{820E}\x{820F}\x{8210}\x{8211}\x{8212}\x{8214}\x{8215}' + . '\x{8216}\x{8218}\x{8219}\x{821A}\x{821B}\x{821C}\x{821D}\x{821E}\x{821F}' + . '\x{8220}\x{8221}\x{8222}\x{8223}\x{8225}\x{8226}\x{8227}\x{8228}\x{8229}' + . '\x{822A}\x{822B}\x{822C}\x{822D}\x{822F}\x{8230}\x{8231}\x{8232}\x{8233}' + . '\x{8234}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{823A}\x{823B}\x{823C}' + . '\x{823D}\x{823E}\x{823F}\x{8240}\x{8242}\x{8243}\x{8244}\x{8245}\x{8246}' + . '\x{8247}\x{8248}\x{8249}\x{824A}\x{824B}\x{824C}\x{824D}\x{824E}\x{824F}' + . '\x{8250}\x{8251}\x{8252}\x{8253}\x{8254}\x{8255}\x{8256}\x{8257}\x{8258}' + . '\x{8259}\x{825A}\x{825B}\x{825C}\x{825D}\x{825E}\x{825F}\x{8260}\x{8261}' + . '\x{8263}\x{8264}\x{8266}\x{8267}\x{8268}\x{8269}\x{826A}\x{826B}\x{826C}' + . '\x{826D}\x{826E}\x{826F}\x{8270}\x{8271}\x{8272}\x{8273}\x{8274}\x{8275}' + . '\x{8276}\x{8277}\x{8278}\x{8279}\x{827A}\x{827B}\x{827C}\x{827D}\x{827E}' + . '\x{827F}\x{8280}\x{8281}\x{8282}\x{8283}\x{8284}\x{8285}\x{8286}\x{8287}' + . '\x{8288}\x{8289}\x{828A}\x{828B}\x{828D}\x{828E}\x{828F}\x{8290}\x{8291}' + . '\x{8292}\x{8293}\x{8294}\x{8295}\x{8296}\x{8297}\x{8298}\x{8299}\x{829A}' + . '\x{829B}\x{829C}\x{829D}\x{829E}\x{829F}\x{82A0}\x{82A1}\x{82A2}\x{82A3}' + . '\x{82A4}\x{82A5}\x{82A6}\x{82A7}\x{82A8}\x{82A9}\x{82AA}\x{82AB}\x{82AC}' + . '\x{82AD}\x{82AE}\x{82AF}\x{82B0}\x{82B1}\x{82B3}\x{82B4}\x{82B5}\x{82B6}' + . '\x{82B7}\x{82B8}\x{82B9}\x{82BA}\x{82BB}\x{82BC}\x{82BD}\x{82BE}\x{82BF}' + . '\x{82C0}\x{82C1}\x{82C2}\x{82C3}\x{82C4}\x{82C5}\x{82C6}\x{82C7}\x{82C8}' + . '\x{82C9}\x{82CA}\x{82CB}\x{82CC}\x{82CD}\x{82CE}\x{82CF}\x{82D0}\x{82D1}' + . '\x{82D2}\x{82D3}\x{82D4}\x{82D5}\x{82D6}\x{82D7}\x{82D8}\x{82D9}\x{82DA}' + . '\x{82DB}\x{82DC}\x{82DD}\x{82DE}\x{82DF}\x{82E0}\x{82E1}\x{82E3}\x{82E4}' + . '\x{82E5}\x{82E6}\x{82E7}\x{82E8}\x{82E9}\x{82EA}\x{82EB}\x{82EC}\x{82ED}' + . '\x{82EE}\x{82EF}\x{82F0}\x{82F1}\x{82F2}\x{82F3}\x{82F4}\x{82F5}\x{82F6}' + . '\x{82F7}\x{82F8}\x{82F9}\x{82FA}\x{82FB}\x{82FD}\x{82FE}\x{82FF}\x{8300}' + . '\x{8301}\x{8302}\x{8303}\x{8304}\x{8305}\x{8306}\x{8307}\x{8308}\x{8309}' + . '\x{830B}\x{830C}\x{830D}\x{830E}\x{830F}\x{8311}\x{8312}\x{8313}\x{8314}' + . '\x{8315}\x{8316}\x{8317}\x{8318}\x{8319}\x{831A}\x{831B}\x{831C}\x{831D}' + . '\x{831E}\x{831F}\x{8320}\x{8321}\x{8322}\x{8323}\x{8324}\x{8325}\x{8326}' + . '\x{8327}\x{8328}\x{8329}\x{832A}\x{832B}\x{832C}\x{832D}\x{832E}\x{832F}' + . '\x{8331}\x{8332}\x{8333}\x{8334}\x{8335}\x{8336}\x{8337}\x{8338}\x{8339}' + . '\x{833A}\x{833B}\x{833C}\x{833D}\x{833E}\x{833F}\x{8340}\x{8341}\x{8342}' + . '\x{8343}\x{8344}\x{8345}\x{8346}\x{8347}\x{8348}\x{8349}\x{834A}\x{834B}' + . '\x{834C}\x{834D}\x{834E}\x{834F}\x{8350}\x{8351}\x{8352}\x{8353}\x{8354}' + . '\x{8356}\x{8357}\x{8358}\x{8359}\x{835A}\x{835B}\x{835C}\x{835D}\x{835E}' + . '\x{835F}\x{8360}\x{8361}\x{8362}\x{8363}\x{8364}\x{8365}\x{8366}\x{8367}' + . '\x{8368}\x{8369}\x{836A}\x{836B}\x{836C}\x{836D}\x{836E}\x{836F}\x{8370}' + . '\x{8371}\x{8372}\x{8373}\x{8374}\x{8375}\x{8376}\x{8377}\x{8378}\x{8379}' + . '\x{837A}\x{837B}\x{837C}\x{837D}\x{837E}\x{837F}\x{8380}\x{8381}\x{8382}' + . '\x{8383}\x{8384}\x{8385}\x{8386}\x{8387}\x{8388}\x{8389}\x{838A}\x{838B}' + . '\x{838C}\x{838D}\x{838E}\x{838F}\x{8390}\x{8391}\x{8392}\x{8393}\x{8394}' + . '\x{8395}\x{8396}\x{8397}\x{8398}\x{8399}\x{839A}\x{839B}\x{839C}\x{839D}' + . '\x{839E}\x{83A0}\x{83A1}\x{83A2}\x{83A3}\x{83A4}\x{83A5}\x{83A6}\x{83A7}' + . '\x{83A8}\x{83A9}\x{83AA}\x{83AB}\x{83AC}\x{83AD}\x{83AE}\x{83AF}\x{83B0}' + . '\x{83B1}\x{83B2}\x{83B3}\x{83B4}\x{83B6}\x{83B7}\x{83B8}\x{83B9}\x{83BA}' + . '\x{83BB}\x{83BC}\x{83BD}\x{83BF}\x{83C0}\x{83C1}\x{83C2}\x{83C3}\x{83C4}' + . '\x{83C5}\x{83C6}\x{83C7}\x{83C8}\x{83C9}\x{83CA}\x{83CB}\x{83CC}\x{83CD}' + . '\x{83CE}\x{83CF}\x{83D0}\x{83D1}\x{83D2}\x{83D3}\x{83D4}\x{83D5}\x{83D6}' + . '\x{83D7}\x{83D8}\x{83D9}\x{83DA}\x{83DB}\x{83DC}\x{83DD}\x{83DE}\x{83DF}' + . '\x{83E0}\x{83E1}\x{83E2}\x{83E3}\x{83E4}\x{83E5}\x{83E7}\x{83E8}\x{83E9}' + . '\x{83EA}\x{83EB}\x{83EC}\x{83EE}\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F3}' + . '\x{83F4}\x{83F5}\x{83F6}\x{83F7}\x{83F8}\x{83F9}\x{83FA}\x{83FB}\x{83FC}' + . '\x{83FD}\x{83FE}\x{83FF}\x{8400}\x{8401}\x{8402}\x{8403}\x{8404}\x{8405}' + . '\x{8406}\x{8407}\x{8408}\x{8409}\x{840A}\x{840B}\x{840C}\x{840D}\x{840E}' + . '\x{840F}\x{8410}\x{8411}\x{8412}\x{8413}\x{8415}\x{8418}\x{8419}\x{841A}' + . '\x{841B}\x{841C}\x{841D}\x{841E}\x{8421}\x{8422}\x{8423}\x{8424}\x{8425}' + . '\x{8426}\x{8427}\x{8428}\x{8429}\x{842A}\x{842B}\x{842C}\x{842D}\x{842E}' + . '\x{842F}\x{8430}\x{8431}\x{8432}\x{8433}\x{8434}\x{8435}\x{8436}\x{8437}' + . '\x{8438}\x{8439}\x{843A}\x{843B}\x{843C}\x{843D}\x{843E}\x{843F}\x{8440}' + . '\x{8441}\x{8442}\x{8443}\x{8444}\x{8445}\x{8446}\x{8447}\x{8448}\x{8449}' + . '\x{844A}\x{844B}\x{844C}\x{844D}\x{844E}\x{844F}\x{8450}\x{8451}\x{8452}' + . '\x{8453}\x{8454}\x{8455}\x{8456}\x{8457}\x{8459}\x{845A}\x{845B}\x{845C}' + . '\x{845D}\x{845E}\x{845F}\x{8460}\x{8461}\x{8462}\x{8463}\x{8464}\x{8465}' + . '\x{8466}\x{8467}\x{8468}\x{8469}\x{846A}\x{846B}\x{846C}\x{846D}\x{846E}' + . '\x{846F}\x{8470}\x{8471}\x{8472}\x{8473}\x{8474}\x{8475}\x{8476}\x{8477}' + . '\x{8478}\x{8479}\x{847A}\x{847B}\x{847C}\x{847D}\x{847E}\x{847F}\x{8480}' + . '\x{8481}\x{8482}\x{8484}\x{8485}\x{8486}\x{8487}\x{8488}\x{8489}\x{848A}' + . '\x{848B}\x{848C}\x{848D}\x{848E}\x{848F}\x{8490}\x{8491}\x{8492}\x{8493}' + . '\x{8494}\x{8496}\x{8497}\x{8498}\x{8499}\x{849A}\x{849B}\x{849C}\x{849D}' + . '\x{849E}\x{849F}\x{84A0}\x{84A1}\x{84A2}\x{84A3}\x{84A4}\x{84A5}\x{84A6}' + . '\x{84A7}\x{84A8}\x{84A9}\x{84AA}\x{84AB}\x{84AC}\x{84AE}\x{84AF}\x{84B0}' + . '\x{84B1}\x{84B2}\x{84B3}\x{84B4}\x{84B5}\x{84B6}\x{84B8}\x{84B9}\x{84BA}' + . '\x{84BB}\x{84BC}\x{84BD}\x{84BE}\x{84BF}\x{84C0}\x{84C1}\x{84C2}\x{84C4}' + . '\x{84C5}\x{84C6}\x{84C7}\x{84C8}\x{84C9}\x{84CA}\x{84CB}\x{84CC}\x{84CD}' + . '\x{84CE}\x{84CF}\x{84D0}\x{84D1}\x{84D2}\x{84D3}\x{84D4}\x{84D5}\x{84D6}' + . '\x{84D7}\x{84D8}\x{84D9}\x{84DB}\x{84DC}\x{84DD}\x{84DE}\x{84DF}\x{84E0}' + . '\x{84E1}\x{84E2}\x{84E3}\x{84E4}\x{84E5}\x{84E6}\x{84E7}\x{84E8}\x{84E9}' + . '\x{84EA}\x{84EB}\x{84EC}\x{84EE}\x{84EF}\x{84F0}\x{84F1}\x{84F2}\x{84F3}' + . '\x{84F4}\x{84F5}\x{84F6}\x{84F7}\x{84F8}\x{84F9}\x{84FA}\x{84FB}\x{84FC}' + . '\x{84FD}\x{84FE}\x{84FF}\x{8500}\x{8501}\x{8502}\x{8503}\x{8504}\x{8506}' + . '\x{8507}\x{8508}\x{8509}\x{850A}\x{850B}\x{850C}\x{850D}\x{850E}\x{850F}' + . '\x{8511}\x{8512}\x{8513}\x{8514}\x{8515}\x{8516}\x{8517}\x{8518}\x{8519}' + . '\x{851A}\x{851B}\x{851C}\x{851D}\x{851E}\x{851F}\x{8520}\x{8521}\x{8522}' + . '\x{8523}\x{8524}\x{8525}\x{8526}\x{8527}\x{8528}\x{8529}\x{852A}\x{852B}' + . '\x{852C}\x{852D}\x{852E}\x{852F}\x{8530}\x{8531}\x{8534}\x{8535}\x{8536}' + . '\x{8537}\x{8538}\x{8539}\x{853A}\x{853B}\x{853C}\x{853D}\x{853E}\x{853F}' + . '\x{8540}\x{8541}\x{8542}\x{8543}\x{8544}\x{8545}\x{8546}\x{8547}\x{8548}' + . '\x{8549}\x{854A}\x{854B}\x{854D}\x{854E}\x{854F}\x{8551}\x{8552}\x{8553}' + . '\x{8554}\x{8555}\x{8556}\x{8557}\x{8558}\x{8559}\x{855A}\x{855B}\x{855C}' + . '\x{855D}\x{855E}\x{855F}\x{8560}\x{8561}\x{8562}\x{8563}\x{8564}\x{8565}' + . '\x{8566}\x{8567}\x{8568}\x{8569}\x{856A}\x{856B}\x{856C}\x{856D}\x{856E}' + . '\x{856F}\x{8570}\x{8571}\x{8572}\x{8573}\x{8574}\x{8575}\x{8576}\x{8577}' + . '\x{8578}\x{8579}\x{857A}\x{857B}\x{857C}\x{857D}\x{857E}\x{8580}\x{8581}' + . '\x{8582}\x{8583}\x{8584}\x{8585}\x{8586}\x{8587}\x{8588}\x{8589}\x{858A}' + . '\x{858B}\x{858C}\x{858D}\x{858E}\x{858F}\x{8590}\x{8591}\x{8592}\x{8594}' + . '\x{8595}\x{8596}\x{8598}\x{8599}\x{859A}\x{859B}\x{859C}\x{859D}\x{859E}' + . '\x{859F}\x{85A0}\x{85A1}\x{85A2}\x{85A3}\x{85A4}\x{85A5}\x{85A6}\x{85A7}' + . '\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AD}\x{85AE}\x{85AF}\x{85B0}' + . '\x{85B1}\x{85B3}\x{85B4}\x{85B5}\x{85B6}\x{85B7}\x{85B8}\x{85B9}\x{85BA}' + . '\x{85BC}\x{85BD}\x{85BE}\x{85BF}\x{85C0}\x{85C1}\x{85C2}\x{85C3}\x{85C4}' + . '\x{85C5}\x{85C6}\x{85C7}\x{85C8}\x{85C9}\x{85CA}\x{85CB}\x{85CD}\x{85CE}' + . '\x{85CF}\x{85D0}\x{85D1}\x{85D2}\x{85D3}\x{85D4}\x{85D5}\x{85D6}\x{85D7}' + . '\x{85D8}\x{85D9}\x{85DA}\x{85DB}\x{85DC}\x{85DD}\x{85DE}\x{85DF}\x{85E0}' + . '\x{85E1}\x{85E2}\x{85E3}\x{85E4}\x{85E5}\x{85E6}\x{85E7}\x{85E8}\x{85E9}' + . '\x{85EA}\x{85EB}\x{85EC}\x{85ED}\x{85EF}\x{85F0}\x{85F1}\x{85F2}\x{85F4}' + . '\x{85F5}\x{85F6}\x{85F7}\x{85F8}\x{85F9}\x{85FA}\x{85FB}\x{85FD}\x{85FE}' + . '\x{85FF}\x{8600}\x{8601}\x{8602}\x{8604}\x{8605}\x{8606}\x{8607}\x{8608}' + . '\x{8609}\x{860A}\x{860B}\x{860C}\x{860F}\x{8611}\x{8612}\x{8613}\x{8614}' + . '\x{8616}\x{8617}\x{8618}\x{8619}\x{861A}\x{861B}\x{861C}\x{861E}\x{861F}' + . '\x{8620}\x{8621}\x{8622}\x{8623}\x{8624}\x{8625}\x{8626}\x{8627}\x{8628}' + . '\x{8629}\x{862A}\x{862B}\x{862C}\x{862D}\x{862E}\x{862F}\x{8630}\x{8631}' + . '\x{8632}\x{8633}\x{8634}\x{8635}\x{8636}\x{8638}\x{8639}\x{863A}\x{863B}' + . '\x{863C}\x{863D}\x{863E}\x{863F}\x{8640}\x{8641}\x{8642}\x{8643}\x{8644}' + . '\x{8645}\x{8646}\x{8647}\x{8648}\x{8649}\x{864A}\x{864B}\x{864C}\x{864D}' + . '\x{864E}\x{864F}\x{8650}\x{8651}\x{8652}\x{8653}\x{8654}\x{8655}\x{8656}' + . '\x{8658}\x{8659}\x{865A}\x{865B}\x{865C}\x{865D}\x{865E}\x{865F}\x{8660}' + . '\x{8661}\x{8662}\x{8663}\x{8664}\x{8665}\x{8666}\x{8667}\x{8668}\x{8669}' + . '\x{866A}\x{866B}\x{866C}\x{866D}\x{866E}\x{866F}\x{8670}\x{8671}\x{8672}' + . '\x{8673}\x{8674}\x{8676}\x{8677}\x{8678}\x{8679}\x{867A}\x{867B}\x{867C}' + . '\x{867D}\x{867E}\x{867F}\x{8680}\x{8681}\x{8682}\x{8683}\x{8684}\x{8685}' + . '\x{8686}\x{8687}\x{8688}\x{868A}\x{868B}\x{868C}\x{868D}\x{868E}\x{868F}' + . '\x{8690}\x{8691}\x{8693}\x{8694}\x{8695}\x{8696}\x{8697}\x{8698}\x{8699}' + . '\x{869A}\x{869B}\x{869C}\x{869D}\x{869E}\x{869F}\x{86A1}\x{86A2}\x{86A3}' + . '\x{86A4}\x{86A5}\x{86A7}\x{86A8}\x{86A9}\x{86AA}\x{86AB}\x{86AC}\x{86AD}' + . '\x{86AE}\x{86AF}\x{86B0}\x{86B1}\x{86B2}\x{86B3}\x{86B4}\x{86B5}\x{86B6}' + . '\x{86B7}\x{86B8}\x{86B9}\x{86BA}\x{86BB}\x{86BC}\x{86BD}\x{86BE}\x{86BF}' + . '\x{86C0}\x{86C1}\x{86C2}\x{86C3}\x{86C4}\x{86C5}\x{86C6}\x{86C7}\x{86C8}' + . '\x{86C9}\x{86CA}\x{86CB}\x{86CC}\x{86CE}\x{86CF}\x{86D0}\x{86D1}\x{86D2}' + . '\x{86D3}\x{86D4}\x{86D6}\x{86D7}\x{86D8}\x{86D9}\x{86DA}\x{86DB}\x{86DC}' + . '\x{86DD}\x{86DE}\x{86DF}\x{86E1}\x{86E2}\x{86E3}\x{86E4}\x{86E5}\x{86E6}' + . '\x{86E8}\x{86E9}\x{86EA}\x{86EB}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F0}' + . '\x{86F1}\x{86F2}\x{86F3}\x{86F4}\x{86F5}\x{86F6}\x{86F7}\x{86F8}\x{86F9}' + . '\x{86FA}\x{86FB}\x{86FC}\x{86FE}\x{86FF}\x{8700}\x{8701}\x{8702}\x{8703}' + . '\x{8704}\x{8705}\x{8706}\x{8707}\x{8708}\x{8709}\x{870A}\x{870B}\x{870C}' + . '\x{870D}\x{870E}\x{870F}\x{8710}\x{8711}\x{8712}\x{8713}\x{8714}\x{8715}' + . '\x{8716}\x{8717}\x{8718}\x{8719}\x{871A}\x{871B}\x{871C}\x{871E}\x{871F}' + . '\x{8720}\x{8721}\x{8722}\x{8723}\x{8724}\x{8725}\x{8726}\x{8727}\x{8728}' + . '\x{8729}\x{872A}\x{872B}\x{872C}\x{872D}\x{872E}\x{8730}\x{8731}\x{8732}' + . '\x{8733}\x{8734}\x{8735}\x{8736}\x{8737}\x{8738}\x{8739}\x{873A}\x{873B}' + . '\x{873C}\x{873E}\x{873F}\x{8740}\x{8741}\x{8742}\x{8743}\x{8744}\x{8746}' + . '\x{8747}\x{8748}\x{8749}\x{874A}\x{874C}\x{874D}\x{874E}\x{874F}\x{8750}' + . '\x{8751}\x{8752}\x{8753}\x{8754}\x{8755}\x{8756}\x{8757}\x{8758}\x{8759}' + . '\x{875A}\x{875B}\x{875C}\x{875D}\x{875E}\x{875F}\x{8760}\x{8761}\x{8762}' + . '\x{8763}\x{8764}\x{8765}\x{8766}\x{8767}\x{8768}\x{8769}\x{876A}\x{876B}' + . '\x{876C}\x{876D}\x{876E}\x{876F}\x{8770}\x{8772}\x{8773}\x{8774}\x{8775}' + . '\x{8776}\x{8777}\x{8778}\x{8779}\x{877A}\x{877B}\x{877C}\x{877D}\x{877E}' + . '\x{8780}\x{8781}\x{8782}\x{8783}\x{8784}\x{8785}\x{8786}\x{8787}\x{8788}' + . '\x{8789}\x{878A}\x{878B}\x{878C}\x{878D}\x{878F}\x{8790}\x{8791}\x{8792}' + . '\x{8793}\x{8794}\x{8795}\x{8796}\x{8797}\x{8798}\x{879A}\x{879B}\x{879C}' + . '\x{879D}\x{879E}\x{879F}\x{87A0}\x{87A1}\x{87A2}\x{87A3}\x{87A4}\x{87A5}' + . '\x{87A6}\x{87A7}\x{87A8}\x{87A9}\x{87AA}\x{87AB}\x{87AC}\x{87AD}\x{87AE}' + . '\x{87AF}\x{87B0}\x{87B1}\x{87B2}\x{87B3}\x{87B4}\x{87B5}\x{87B6}\x{87B7}' + . '\x{87B8}\x{87B9}\x{87BA}\x{87BB}\x{87BC}\x{87BD}\x{87BE}\x{87BF}\x{87C0}' + . '\x{87C1}\x{87C2}\x{87C3}\x{87C4}\x{87C5}\x{87C6}\x{87C7}\x{87C8}\x{87C9}' + . '\x{87CA}\x{87CB}\x{87CC}\x{87CD}\x{87CE}\x{87CF}\x{87D0}\x{87D1}\x{87D2}' + . '\x{87D3}\x{87D4}\x{87D5}\x{87D6}\x{87D7}\x{87D8}\x{87D9}\x{87DB}\x{87DC}' + . '\x{87DD}\x{87DE}\x{87DF}\x{87E0}\x{87E1}\x{87E2}\x{87E3}\x{87E4}\x{87E5}' + . '\x{87E6}\x{87E7}\x{87E8}\x{87E9}\x{87EA}\x{87EB}\x{87EC}\x{87ED}\x{87EE}' + . '\x{87EF}\x{87F1}\x{87F2}\x{87F3}\x{87F4}\x{87F5}\x{87F6}\x{87F7}\x{87F8}' + . '\x{87F9}\x{87FA}\x{87FB}\x{87FC}\x{87FD}\x{87FE}\x{87FF}\x{8800}\x{8801}' + . '\x{8802}\x{8803}\x{8804}\x{8805}\x{8806}\x{8808}\x{8809}\x{880A}\x{880B}' + . '\x{880C}\x{880D}\x{880E}\x{880F}\x{8810}\x{8811}\x{8813}\x{8814}\x{8815}' + . '\x{8816}\x{8817}\x{8818}\x{8819}\x{881A}\x{881B}\x{881C}\x{881D}\x{881E}' + . '\x{881F}\x{8820}\x{8821}\x{8822}\x{8823}\x{8824}\x{8825}\x{8826}\x{8827}' + . '\x{8828}\x{8829}\x{882A}\x{882B}\x{882C}\x{882E}\x{882F}\x{8830}\x{8831}' + . '\x{8832}\x{8833}\x{8834}\x{8835}\x{8836}\x{8837}\x{8838}\x{8839}\x{883B}' + . '\x{883C}\x{883D}\x{883E}\x{883F}\x{8840}\x{8841}\x{8842}\x{8843}\x{8844}' + . '\x{8845}\x{8846}\x{8848}\x{8849}\x{884A}\x{884B}\x{884C}\x{884D}\x{884E}' + . '\x{884F}\x{8850}\x{8851}\x{8852}\x{8853}\x{8854}\x{8855}\x{8856}\x{8857}' + . '\x{8859}\x{885A}\x{885B}\x{885D}\x{885E}\x{8860}\x{8861}\x{8862}\x{8863}' + . '\x{8864}\x{8865}\x{8866}\x{8867}\x{8868}\x{8869}\x{886A}\x{886B}\x{886C}' + . '\x{886D}\x{886E}\x{886F}\x{8870}\x{8871}\x{8872}\x{8873}\x{8874}\x{8875}' + . '\x{8876}\x{8877}\x{8878}\x{8879}\x{887B}\x{887C}\x{887D}\x{887E}\x{887F}' + . '\x{8880}\x{8881}\x{8882}\x{8883}\x{8884}\x{8885}\x{8886}\x{8887}\x{8888}' + . '\x{8889}\x{888A}\x{888B}\x{888C}\x{888D}\x{888E}\x{888F}\x{8890}\x{8891}' + . '\x{8892}\x{8893}\x{8894}\x{8895}\x{8896}\x{8897}\x{8898}\x{8899}\x{889A}' + . '\x{889B}\x{889C}\x{889D}\x{889E}\x{889F}\x{88A0}\x{88A1}\x{88A2}\x{88A3}' + . '\x{88A4}\x{88A5}\x{88A6}\x{88A7}\x{88A8}\x{88A9}\x{88AA}\x{88AB}\x{88AC}' + . '\x{88AD}\x{88AE}\x{88AF}\x{88B0}\x{88B1}\x{88B2}\x{88B3}\x{88B4}\x{88B6}' + . '\x{88B7}\x{88B8}\x{88B9}\x{88BA}\x{88BB}\x{88BC}\x{88BD}\x{88BE}\x{88BF}' + . '\x{88C0}\x{88C1}\x{88C2}\x{88C3}\x{88C4}\x{88C5}\x{88C6}\x{88C7}\x{88C8}' + . '\x{88C9}\x{88CA}\x{88CB}\x{88CC}\x{88CD}\x{88CE}\x{88CF}\x{88D0}\x{88D1}' + . '\x{88D2}\x{88D3}\x{88D4}\x{88D5}\x{88D6}\x{88D7}\x{88D8}\x{88D9}\x{88DA}' + . '\x{88DB}\x{88DC}\x{88DD}\x{88DE}\x{88DF}\x{88E0}\x{88E1}\x{88E2}\x{88E3}' + . '\x{88E4}\x{88E5}\x{88E7}\x{88E8}\x{88EA}\x{88EB}\x{88EC}\x{88EE}\x{88EF}' + . '\x{88F0}\x{88F1}\x{88F2}\x{88F3}\x{88F4}\x{88F5}\x{88F6}\x{88F7}\x{88F8}' + . '\x{88F9}\x{88FA}\x{88FB}\x{88FC}\x{88FD}\x{88FE}\x{88FF}\x{8900}\x{8901}' + . '\x{8902}\x{8904}\x{8905}\x{8906}\x{8907}\x{8908}\x{8909}\x{890A}\x{890B}' + . '\x{890C}\x{890D}\x{890E}\x{8910}\x{8911}\x{8912}\x{8913}\x{8914}\x{8915}' + . '\x{8916}\x{8917}\x{8918}\x{8919}\x{891A}\x{891B}\x{891C}\x{891D}\x{891E}' + . '\x{891F}\x{8920}\x{8921}\x{8922}\x{8923}\x{8925}\x{8926}\x{8927}\x{8928}' + . '\x{8929}\x{892A}\x{892B}\x{892C}\x{892D}\x{892E}\x{892F}\x{8930}\x{8931}' + . '\x{8932}\x{8933}\x{8934}\x{8935}\x{8936}\x{8937}\x{8938}\x{8939}\x{893A}' + . '\x{893B}\x{893C}\x{893D}\x{893E}\x{893F}\x{8940}\x{8941}\x{8942}\x{8943}' + . '\x{8944}\x{8945}\x{8946}\x{8947}\x{8948}\x{8949}\x{894A}\x{894B}\x{894C}' + . '\x{894E}\x{894F}\x{8950}\x{8951}\x{8952}\x{8953}\x{8954}\x{8955}\x{8956}' + . '\x{8957}\x{8958}\x{8959}\x{895A}\x{895B}\x{895C}\x{895D}\x{895E}\x{895F}' + . '\x{8960}\x{8961}\x{8962}\x{8963}\x{8964}\x{8966}\x{8967}\x{8968}\x{8969}' + . '\x{896A}\x{896B}\x{896C}\x{896D}\x{896E}\x{896F}\x{8970}\x{8971}\x{8972}' + . '\x{8973}\x{8974}\x{8976}\x{8977}\x{8978}\x{8979}\x{897A}\x{897B}\x{897C}' + . '\x{897E}\x{897F}\x{8980}\x{8981}\x{8982}\x{8983}\x{8984}\x{8985}\x{8986}' + . '\x{8987}\x{8988}\x{8989}\x{898A}\x{898B}\x{898C}\x{898E}\x{898F}\x{8991}' + . '\x{8992}\x{8993}\x{8995}\x{8996}\x{8997}\x{8998}\x{899A}\x{899B}\x{899C}' + . '\x{899D}\x{899E}\x{899F}\x{89A0}\x{89A1}\x{89A2}\x{89A3}\x{89A4}\x{89A5}' + . '\x{89A6}\x{89A7}\x{89A8}\x{89AA}\x{89AB}\x{89AC}\x{89AD}\x{89AE}\x{89AF}' + . '\x{89B1}\x{89B2}\x{89B3}\x{89B5}\x{89B6}\x{89B7}\x{89B8}\x{89B9}\x{89BA}' + . '\x{89BD}\x{89BE}\x{89BF}\x{89C0}\x{89C1}\x{89C2}\x{89C3}\x{89C4}\x{89C5}' + . '\x{89C6}\x{89C7}\x{89C8}\x{89C9}\x{89CA}\x{89CB}\x{89CC}\x{89CD}\x{89CE}' + . '\x{89CF}\x{89D0}\x{89D1}\x{89D2}\x{89D3}\x{89D4}\x{89D5}\x{89D6}\x{89D7}' + . '\x{89D8}\x{89D9}\x{89DA}\x{89DB}\x{89DC}\x{89DD}\x{89DE}\x{89DF}\x{89E0}' + . '\x{89E1}\x{89E2}\x{89E3}\x{89E4}\x{89E5}\x{89E6}\x{89E7}\x{89E8}\x{89E9}' + . '\x{89EA}\x{89EB}\x{89EC}\x{89ED}\x{89EF}\x{89F0}\x{89F1}\x{89F2}\x{89F3}' + . '\x{89F4}\x{89F6}\x{89F7}\x{89F8}\x{89FA}\x{89FB}\x{89FC}\x{89FE}\x{89FF}' + . '\x{8A00}\x{8A01}\x{8A02}\x{8A03}\x{8A04}\x{8A07}\x{8A08}\x{8A09}\x{8A0A}' + . '\x{8A0B}\x{8A0C}\x{8A0D}\x{8A0E}\x{8A0F}\x{8A10}\x{8A11}\x{8A12}\x{8A13}' + . '\x{8A15}\x{8A16}\x{8A17}\x{8A18}\x{8A1A}\x{8A1B}\x{8A1C}\x{8A1D}\x{8A1E}' + . '\x{8A1F}\x{8A22}\x{8A23}\x{8A24}\x{8A25}\x{8A26}\x{8A27}\x{8A28}\x{8A29}' + . '\x{8A2A}\x{8A2C}\x{8A2D}\x{8A2E}\x{8A2F}\x{8A30}\x{8A31}\x{8A32}\x{8A34}' + . '\x{8A35}\x{8A36}\x{8A37}\x{8A38}\x{8A39}\x{8A3A}\x{8A3B}\x{8A3C}\x{8A3E}' + . '\x{8A3F}\x{8A40}\x{8A41}\x{8A42}\x{8A43}\x{8A44}\x{8A45}\x{8A46}\x{8A47}' + . '\x{8A48}\x{8A49}\x{8A4A}\x{8A4C}\x{8A4D}\x{8A4E}\x{8A4F}\x{8A50}\x{8A51}' + . '\x{8A52}\x{8A53}\x{8A54}\x{8A55}\x{8A56}\x{8A57}\x{8A58}\x{8A59}\x{8A5A}' + . '\x{8A5B}\x{8A5C}\x{8A5D}\x{8A5E}\x{8A5F}\x{8A60}\x{8A61}\x{8A62}\x{8A63}' + . '\x{8A65}\x{8A66}\x{8A67}\x{8A68}\x{8A69}\x{8A6A}\x{8A6B}\x{8A6C}\x{8A6D}' + . '\x{8A6E}\x{8A6F}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A74}\x{8A75}\x{8A76}' + . '\x{8A77}\x{8A79}\x{8A7A}\x{8A7B}\x{8A7C}\x{8A7E}\x{8A7F}\x{8A80}\x{8A81}' + . '\x{8A82}\x{8A83}\x{8A84}\x{8A85}\x{8A86}\x{8A87}\x{8A89}\x{8A8A}\x{8A8B}' + . '\x{8A8C}\x{8A8D}\x{8A8E}\x{8A8F}\x{8A90}\x{8A91}\x{8A92}\x{8A93}\x{8A94}' + . '\x{8A95}\x{8A96}\x{8A97}\x{8A98}\x{8A99}\x{8A9A}\x{8A9B}\x{8A9C}\x{8A9D}' + . '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA2}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA7}' + . '\x{8AA8}\x{8AA9}\x{8AAA}\x{8AAB}\x{8AAC}\x{8AAE}\x{8AB0}\x{8AB1}\x{8AB2}' + . '\x{8AB3}\x{8AB4}\x{8AB5}\x{8AB6}\x{8AB8}\x{8AB9}\x{8ABA}\x{8ABB}\x{8ABC}' + . '\x{8ABD}\x{8ABE}\x{8ABF}\x{8AC0}\x{8AC1}\x{8AC2}\x{8AC3}\x{8AC4}\x{8AC5}' + . '\x{8AC6}\x{8AC7}\x{8AC8}\x{8AC9}\x{8ACA}\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACE}' + . '\x{8ACF}\x{8AD1}\x{8AD2}\x{8AD3}\x{8AD4}\x{8AD5}\x{8AD6}\x{8AD7}\x{8AD8}' + . '\x{8AD9}\x{8ADA}\x{8ADB}\x{8ADC}\x{8ADD}\x{8ADE}\x{8ADF}\x{8AE0}\x{8AE1}' + . '\x{8AE2}\x{8AE3}\x{8AE4}\x{8AE5}\x{8AE6}\x{8AE7}\x{8AE8}\x{8AE9}\x{8AEA}' + . '\x{8AEB}\x{8AED}\x{8AEE}\x{8AEF}\x{8AF0}\x{8AF1}\x{8AF2}\x{8AF3}\x{8AF4}' + . '\x{8AF5}\x{8AF6}\x{8AF7}\x{8AF8}\x{8AF9}\x{8AFA}\x{8AFB}\x{8AFC}\x{8AFD}' + . '\x{8AFE}\x{8AFF}\x{8B00}\x{8B01}\x{8B02}\x{8B03}\x{8B04}\x{8B05}\x{8B06}' + . '\x{8B07}\x{8B08}\x{8B09}\x{8B0A}\x{8B0B}\x{8B0D}\x{8B0E}\x{8B0F}\x{8B10}' + . '\x{8B11}\x{8B12}\x{8B13}\x{8B14}\x{8B15}\x{8B16}\x{8B17}\x{8B18}\x{8B19}' + . '\x{8B1A}\x{8B1B}\x{8B1C}\x{8B1D}\x{8B1E}\x{8B1F}\x{8B20}\x{8B21}\x{8B22}' + . '\x{8B23}\x{8B24}\x{8B25}\x{8B26}\x{8B27}\x{8B28}\x{8B2A}\x{8B2B}\x{8B2C}' + . '\x{8B2D}\x{8B2E}\x{8B2F}\x{8B30}\x{8B31}\x{8B33}\x{8B34}\x{8B35}\x{8B36}' + . '\x{8B37}\x{8B39}\x{8B3A}\x{8B3B}\x{8B3C}\x{8B3D}\x{8B3E}\x{8B40}\x{8B41}' + . '\x{8B42}\x{8B43}\x{8B44}\x{8B45}\x{8B46}\x{8B47}\x{8B48}\x{8B49}\x{8B4A}' + . '\x{8B4B}\x{8B4C}\x{8B4D}\x{8B4E}\x{8B4F}\x{8B50}\x{8B51}\x{8B52}\x{8B53}' + . '\x{8B54}\x{8B55}\x{8B56}\x{8B57}\x{8B58}\x{8B59}\x{8B5A}\x{8B5B}\x{8B5C}' + . '\x{8B5D}\x{8B5E}\x{8B5F}\x{8B60}\x{8B63}\x{8B64}\x{8B65}\x{8B66}\x{8B67}' + . '\x{8B68}\x{8B6A}\x{8B6B}\x{8B6C}\x{8B6D}\x{8B6E}\x{8B6F}\x{8B70}\x{8B71}' + . '\x{8B73}\x{8B74}\x{8B76}\x{8B77}\x{8B78}\x{8B79}\x{8B7A}\x{8B7B}\x{8B7D}' + . '\x{8B7E}\x{8B7F}\x{8B80}\x{8B82}\x{8B83}\x{8B84}\x{8B85}\x{8B86}\x{8B88}' + . '\x{8B89}\x{8B8A}\x{8B8B}\x{8B8C}\x{8B8E}\x{8B90}\x{8B91}\x{8B92}\x{8B93}' + . '\x{8B94}\x{8B95}\x{8B96}\x{8B97}\x{8B98}\x{8B99}\x{8B9A}\x{8B9C}\x{8B9D}' + . '\x{8B9E}\x{8B9F}\x{8BA0}\x{8BA1}\x{8BA2}\x{8BA3}\x{8BA4}\x{8BA5}\x{8BA6}' + . '\x{8BA7}\x{8BA8}\x{8BA9}\x{8BAA}\x{8BAB}\x{8BAC}\x{8BAD}\x{8BAE}\x{8BAF}' + . '\x{8BB0}\x{8BB1}\x{8BB2}\x{8BB3}\x{8BB4}\x{8BB5}\x{8BB6}\x{8BB7}\x{8BB8}' + . '\x{8BB9}\x{8BBA}\x{8BBB}\x{8BBC}\x{8BBD}\x{8BBE}\x{8BBF}\x{8BC0}\x{8BC1}' + . '\x{8BC2}\x{8BC3}\x{8BC4}\x{8BC5}\x{8BC6}\x{8BC7}\x{8BC8}\x{8BC9}\x{8BCA}' + . '\x{8BCB}\x{8BCC}\x{8BCD}\x{8BCE}\x{8BCF}\x{8BD0}\x{8BD1}\x{8BD2}\x{8BD3}' + . '\x{8BD4}\x{8BD5}\x{8BD6}\x{8BD7}\x{8BD8}\x{8BD9}\x{8BDA}\x{8BDB}\x{8BDC}' + . '\x{8BDD}\x{8BDE}\x{8BDF}\x{8BE0}\x{8BE1}\x{8BE2}\x{8BE3}\x{8BE4}\x{8BE5}' + . '\x{8BE6}\x{8BE7}\x{8BE8}\x{8BE9}\x{8BEA}\x{8BEB}\x{8BEC}\x{8BED}\x{8BEE}' + . '\x{8BEF}\x{8BF0}\x{8BF1}\x{8BF2}\x{8BF3}\x{8BF4}\x{8BF5}\x{8BF6}\x{8BF7}' + . '\x{8BF8}\x{8BF9}\x{8BFA}\x{8BFB}\x{8BFC}\x{8BFD}\x{8BFE}\x{8BFF}\x{8C00}' + . '\x{8C01}\x{8C02}\x{8C03}\x{8C04}\x{8C05}\x{8C06}\x{8C07}\x{8C08}\x{8C09}' + . '\x{8C0A}\x{8C0B}\x{8C0C}\x{8C0D}\x{8C0E}\x{8C0F}\x{8C10}\x{8C11}\x{8C12}' + . '\x{8C13}\x{8C14}\x{8C15}\x{8C16}\x{8C17}\x{8C18}\x{8C19}\x{8C1A}\x{8C1B}' + . '\x{8C1C}\x{8C1D}\x{8C1E}\x{8C1F}\x{8C20}\x{8C21}\x{8C22}\x{8C23}\x{8C24}' + . '\x{8C25}\x{8C26}\x{8C27}\x{8C28}\x{8C29}\x{8C2A}\x{8C2B}\x{8C2C}\x{8C2D}' + . '\x{8C2E}\x{8C2F}\x{8C30}\x{8C31}\x{8C32}\x{8C33}\x{8C34}\x{8C35}\x{8C36}' + . '\x{8C37}\x{8C39}\x{8C3A}\x{8C3B}\x{8C3C}\x{8C3D}\x{8C3E}\x{8C3F}\x{8C41}' + . '\x{8C42}\x{8C43}\x{8C45}\x{8C46}\x{8C47}\x{8C48}\x{8C49}\x{8C4A}\x{8C4B}' + . '\x{8C4C}\x{8C4D}\x{8C4E}\x{8C4F}\x{8C50}\x{8C54}\x{8C55}\x{8C56}\x{8C57}' + . '\x{8C59}\x{8C5A}\x{8C5B}\x{8C5C}\x{8C5D}\x{8C5E}\x{8C5F}\x{8C60}\x{8C61}' + . '\x{8C62}\x{8C63}\x{8C64}\x{8C65}\x{8C66}\x{8C67}\x{8C68}\x{8C69}\x{8C6A}' + . '\x{8C6B}\x{8C6C}\x{8C6D}\x{8C6E}\x{8C6F}\x{8C70}\x{8C71}\x{8C72}\x{8C73}' + . '\x{8C75}\x{8C76}\x{8C77}\x{8C78}\x{8C79}\x{8C7A}\x{8C7B}\x{8C7D}\x{8C7E}' + . '\x{8C80}\x{8C81}\x{8C82}\x{8C84}\x{8C85}\x{8C86}\x{8C88}\x{8C89}\x{8C8A}' + . '\x{8C8C}\x{8C8D}\x{8C8F}\x{8C90}\x{8C91}\x{8C92}\x{8C93}\x{8C94}\x{8C95}' + . '\x{8C96}\x{8C97}\x{8C98}\x{8C99}\x{8C9A}\x{8C9C}\x{8C9D}\x{8C9E}\x{8C9F}' + . '\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA3}\x{8CA4}\x{8CA5}\x{8CA7}\x{8CA8}\x{8CA9}' + . '\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}\x{8CB1}\x{8CB2}' + . '\x{8CB3}\x{8CB4}\x{8CB5}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CB9}\x{8CBA}\x{8CBB}' + . '\x{8CBC}\x{8CBD}\x{8CBE}\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}' + . '\x{8CC5}\x{8CC6}\x{8CC7}\x{8CC8}\x{8CC9}\x{8CCA}\x{8CCC}\x{8CCE}\x{8CCF}' + . '\x{8CD0}\x{8CD1}\x{8CD2}\x{8CD3}\x{8CD4}\x{8CD5}\x{8CD7}\x{8CD9}\x{8CDA}' + . '\x{8CDB}\x{8CDC}\x{8CDD}\x{8CDE}\x{8CDF}\x{8CE0}\x{8CE1}\x{8CE2}\x{8CE3}' + . '\x{8CE4}\x{8CE5}\x{8CE6}\x{8CE7}\x{8CE8}\x{8CEA}\x{8CEB}\x{8CEC}\x{8CED}' + . '\x{8CEE}\x{8CEF}\x{8CF0}\x{8CF1}\x{8CF2}\x{8CF3}\x{8CF4}\x{8CF5}\x{8CF6}' + . '\x{8CF8}\x{8CF9}\x{8CFA}\x{8CFB}\x{8CFC}\x{8CFD}\x{8CFE}\x{8CFF}\x{8D00}' + . '\x{8D02}\x{8D03}\x{8D04}\x{8D05}\x{8D06}\x{8D07}\x{8D08}\x{8D09}\x{8D0A}' + . '\x{8D0B}\x{8D0C}\x{8D0D}\x{8D0E}\x{8D0F}\x{8D10}\x{8D13}\x{8D14}\x{8D15}' + . '\x{8D16}\x{8D17}\x{8D18}\x{8D19}\x{8D1A}\x{8D1B}\x{8D1C}\x{8D1D}\x{8D1E}' + . '\x{8D1F}\x{8D20}\x{8D21}\x{8D22}\x{8D23}\x{8D24}\x{8D25}\x{8D26}\x{8D27}' + . '\x{8D28}\x{8D29}\x{8D2A}\x{8D2B}\x{8D2C}\x{8D2D}\x{8D2E}\x{8D2F}\x{8D30}' + . '\x{8D31}\x{8D32}\x{8D33}\x{8D34}\x{8D35}\x{8D36}\x{8D37}\x{8D38}\x{8D39}' + . '\x{8D3A}\x{8D3B}\x{8D3C}\x{8D3D}\x{8D3E}\x{8D3F}\x{8D40}\x{8D41}\x{8D42}' + . '\x{8D43}\x{8D44}\x{8D45}\x{8D46}\x{8D47}\x{8D48}\x{8D49}\x{8D4A}\x{8D4B}' + . '\x{8D4C}\x{8D4D}\x{8D4E}\x{8D4F}\x{8D50}\x{8D51}\x{8D52}\x{8D53}\x{8D54}' + . '\x{8D55}\x{8D56}\x{8D57}\x{8D58}\x{8D59}\x{8D5A}\x{8D5B}\x{8D5C}\x{8D5D}' + . '\x{8D5E}\x{8D5F}\x{8D60}\x{8D61}\x{8D62}\x{8D63}\x{8D64}\x{8D65}\x{8D66}' + . '\x{8D67}\x{8D68}\x{8D69}\x{8D6A}\x{8D6B}\x{8D6C}\x{8D6D}\x{8D6E}\x{8D6F}' + . '\x{8D70}\x{8D71}\x{8D72}\x{8D73}\x{8D74}\x{8D75}\x{8D76}\x{8D77}\x{8D78}' + . '\x{8D79}\x{8D7A}\x{8D7B}\x{8D7D}\x{8D7E}\x{8D7F}\x{8D80}\x{8D81}\x{8D82}' + . '\x{8D83}\x{8D84}\x{8D85}\x{8D86}\x{8D87}\x{8D88}\x{8D89}\x{8D8A}\x{8D8B}' + . '\x{8D8C}\x{8D8D}\x{8D8E}\x{8D8F}\x{8D90}\x{8D91}\x{8D92}\x{8D93}\x{8D94}' + . '\x{8D95}\x{8D96}\x{8D97}\x{8D98}\x{8D99}\x{8D9A}\x{8D9B}\x{8D9C}\x{8D9D}' + . '\x{8D9E}\x{8D9F}\x{8DA0}\x{8DA1}\x{8DA2}\x{8DA3}\x{8DA4}\x{8DA5}\x{8DA7}' + . '\x{8DA8}\x{8DA9}\x{8DAA}\x{8DAB}\x{8DAC}\x{8DAD}\x{8DAE}\x{8DAF}\x{8DB0}' + . '\x{8DB1}\x{8DB2}\x{8DB3}\x{8DB4}\x{8DB5}\x{8DB6}\x{8DB7}\x{8DB8}\x{8DB9}' + . '\x{8DBA}\x{8DBB}\x{8DBC}\x{8DBD}\x{8DBE}\x{8DBF}\x{8DC1}\x{8DC2}\x{8DC3}' + . '\x{8DC4}\x{8DC5}\x{8DC6}\x{8DC7}\x{8DC8}\x{8DC9}\x{8DCA}\x{8DCB}\x{8DCC}' + . '\x{8DCD}\x{8DCE}\x{8DCF}\x{8DD0}\x{8DD1}\x{8DD2}\x{8DD3}\x{8DD4}\x{8DD5}' + . '\x{8DD6}\x{8DD7}\x{8DD8}\x{8DD9}\x{8DDA}\x{8DDB}\x{8DDC}\x{8DDD}\x{8DDE}' + . '\x{8DDF}\x{8DE0}\x{8DE1}\x{8DE2}\x{8DE3}\x{8DE4}\x{8DE6}\x{8DE7}\x{8DE8}' + . '\x{8DE9}\x{8DEA}\x{8DEB}\x{8DEC}\x{8DED}\x{8DEE}\x{8DEF}\x{8DF0}\x{8DF1}' + . '\x{8DF2}\x{8DF3}\x{8DF4}\x{8DF5}\x{8DF6}\x{8DF7}\x{8DF8}\x{8DF9}\x{8DFA}' + . '\x{8DFB}\x{8DFC}\x{8DFD}\x{8DFE}\x{8DFF}\x{8E00}\x{8E02}\x{8E03}\x{8E04}' + . '\x{8E05}\x{8E06}\x{8E07}\x{8E08}\x{8E09}\x{8E0A}\x{8E0C}\x{8E0D}\x{8E0E}' + . '\x{8E0F}\x{8E10}\x{8E11}\x{8E12}\x{8E13}\x{8E14}\x{8E15}\x{8E16}\x{8E17}' + . '\x{8E18}\x{8E19}\x{8E1A}\x{8E1B}\x{8E1C}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E20}' + . '\x{8E21}\x{8E22}\x{8E23}\x{8E24}\x{8E25}\x{8E26}\x{8E27}\x{8E28}\x{8E29}' + . '\x{8E2A}\x{8E2B}\x{8E2C}\x{8E2D}\x{8E2E}\x{8E2F}\x{8E30}\x{8E31}\x{8E33}' + . '\x{8E34}\x{8E35}\x{8E36}\x{8E37}\x{8E38}\x{8E39}\x{8E3A}\x{8E3B}\x{8E3C}' + . '\x{8E3D}\x{8E3E}\x{8E3F}\x{8E40}\x{8E41}\x{8E42}\x{8E43}\x{8E44}\x{8E45}' + . '\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4B}\x{8E4C}\x{8E4D}\x{8E4E}\x{8E50}' + . '\x{8E51}\x{8E52}\x{8E53}\x{8E54}\x{8E55}\x{8E56}\x{8E57}\x{8E58}\x{8E59}' + . '\x{8E5A}\x{8E5B}\x{8E5C}\x{8E5D}\x{8E5E}\x{8E5F}\x{8E60}\x{8E61}\x{8E62}' + . '\x{8E63}\x{8E64}\x{8E65}\x{8E66}\x{8E67}\x{8E68}\x{8E69}\x{8E6A}\x{8E6B}' + . '\x{8E6C}\x{8E6D}\x{8E6F}\x{8E70}\x{8E71}\x{8E72}\x{8E73}\x{8E74}\x{8E76}' + . '\x{8E78}\x{8E7A}\x{8E7B}\x{8E7C}\x{8E7D}\x{8E7E}\x{8E7F}\x{8E80}\x{8E81}' + . '\x{8E82}\x{8E83}\x{8E84}\x{8E85}\x{8E86}\x{8E87}\x{8E88}\x{8E89}\x{8E8A}' + . '\x{8E8B}\x{8E8C}\x{8E8D}\x{8E8E}\x{8E8F}\x{8E90}\x{8E91}\x{8E92}\x{8E93}' + . '\x{8E94}\x{8E95}\x{8E96}\x{8E97}\x{8E98}\x{8E9A}\x{8E9C}\x{8E9D}\x{8E9E}' + . '\x{8E9F}\x{8EA0}\x{8EA1}\x{8EA3}\x{8EA4}\x{8EA5}\x{8EA6}\x{8EA7}\x{8EA8}' + . '\x{8EA9}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAD}\x{8EAE}\x{8EAF}\x{8EB0}\x{8EB1}' + . '\x{8EB2}\x{8EB4}\x{8EB5}\x{8EB8}\x{8EB9}\x{8EBA}\x{8EBB}\x{8EBC}\x{8EBD}' + . '\x{8EBE}\x{8EBF}\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}\x{8EC6}\x{8EC7}\x{8EC8}' + . '\x{8EC9}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ECE}\x{8ECF}\x{8ED0}\x{8ED1}' + . '\x{8ED2}\x{8ED3}\x{8ED4}\x{8ED5}\x{8ED6}\x{8ED7}\x{8ED8}\x{8EDA}\x{8EDB}' + . '\x{8EDC}\x{8EDD}\x{8EDE}\x{8EDF}\x{8EE0}\x{8EE1}\x{8EE4}\x{8EE5}\x{8EE6}' + . '\x{8EE7}\x{8EE8}\x{8EE9}\x{8EEA}\x{8EEB}\x{8EEC}\x{8EED}\x{8EEE}\x{8EEF}' + . '\x{8EF1}\x{8EF2}\x{8EF3}\x{8EF4}\x{8EF5}\x{8EF6}\x{8EF7}\x{8EF8}\x{8EF9}' + . '\x{8EFA}\x{8EFB}\x{8EFC}\x{8EFD}\x{8EFE}\x{8EFF}\x{8F00}\x{8F01}\x{8F02}' + . '\x{8F03}\x{8F04}\x{8F05}\x{8F06}\x{8F07}\x{8F08}\x{8F09}\x{8F0A}\x{8F0B}' + . '\x{8F0D}\x{8F0E}\x{8F10}\x{8F11}\x{8F12}\x{8F13}\x{8F14}\x{8F15}\x{8F16}' + . '\x{8F17}\x{8F18}\x{8F1A}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1E}\x{8F1F}\x{8F20}' + . '\x{8F21}\x{8F22}\x{8F23}\x{8F24}\x{8F25}\x{8F26}\x{8F27}\x{8F28}\x{8F29}' + . '\x{8F2A}\x{8F2B}\x{8F2C}\x{8F2E}\x{8F2F}\x{8F30}\x{8F31}\x{8F32}\x{8F33}' + . '\x{8F34}\x{8F35}\x{8F36}\x{8F37}\x{8F38}\x{8F39}\x{8F3B}\x{8F3C}\x{8F3D}' + . '\x{8F3E}\x{8F3F}\x{8F40}\x{8F42}\x{8F43}\x{8F44}\x{8F45}\x{8F46}\x{8F47}' + . '\x{8F48}\x{8F49}\x{8F4A}\x{8F4B}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F4F}\x{8F50}' + . '\x{8F51}\x{8F52}\x{8F53}\x{8F54}\x{8F55}\x{8F56}\x{8F57}\x{8F58}\x{8F59}' + . '\x{8F5A}\x{8F5B}\x{8F5D}\x{8F5E}\x{8F5F}\x{8F60}\x{8F61}\x{8F62}\x{8F63}' + . '\x{8F64}\x{8F65}\x{8F66}\x{8F67}\x{8F68}\x{8F69}\x{8F6A}\x{8F6B}\x{8F6C}' + . '\x{8F6D}\x{8F6E}\x{8F6F}\x{8F70}\x{8F71}\x{8F72}\x{8F73}\x{8F74}\x{8F75}' + . '\x{8F76}\x{8F77}\x{8F78}\x{8F79}\x{8F7A}\x{8F7B}\x{8F7C}\x{8F7D}\x{8F7E}' + . '\x{8F7F}\x{8F80}\x{8F81}\x{8F82}\x{8F83}\x{8F84}\x{8F85}\x{8F86}\x{8F87}' + . '\x{8F88}\x{8F89}\x{8F8A}\x{8F8B}\x{8F8C}\x{8F8D}\x{8F8E}\x{8F8F}\x{8F90}' + . '\x{8F91}\x{8F92}\x{8F93}\x{8F94}\x{8F95}\x{8F96}\x{8F97}\x{8F98}\x{8F99}' + . '\x{8F9A}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA0}\x{8FA1}\x{8FA2}\x{8FA3}' + . '\x{8FA5}\x{8FA6}\x{8FA7}\x{8FA8}\x{8FA9}\x{8FAA}\x{8FAB}\x{8FAC}\x{8FAD}' + . '\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB4}\x{8FB5}\x{8FB6}\x{8FB7}' + . '\x{8FB8}\x{8FB9}\x{8FBB}\x{8FBC}\x{8FBD}\x{8FBE}\x{8FBF}\x{8FC0}\x{8FC1}' + . '\x{8FC2}\x{8FC4}\x{8FC5}\x{8FC6}\x{8FC7}\x{8FC8}\x{8FC9}\x{8FCB}\x{8FCC}' + . '\x{8FCD}\x{8FCE}\x{8FCF}\x{8FD0}\x{8FD1}\x{8FD2}\x{8FD3}\x{8FD4}\x{8FD5}' + . '\x{8FD6}\x{8FD7}\x{8FD8}\x{8FD9}\x{8FDA}\x{8FDB}\x{8FDC}\x{8FDD}\x{8FDE}' + . '\x{8FDF}\x{8FE0}\x{8FE1}\x{8FE2}\x{8FE3}\x{8FE4}\x{8FE5}\x{8FE6}\x{8FE8}' + . '\x{8FE9}\x{8FEA}\x{8FEB}\x{8FEC}\x{8FED}\x{8FEE}\x{8FEF}\x{8FF0}\x{8FF1}' + . '\x{8FF2}\x{8FF3}\x{8FF4}\x{8FF5}\x{8FF6}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}' + . '\x{8FFB}\x{8FFC}\x{8FFD}\x{8FFE}\x{8FFF}\x{9000}\x{9001}\x{9002}\x{9003}' + . '\x{9004}\x{9005}\x{9006}\x{9007}\x{9008}\x{9009}\x{900A}\x{900B}\x{900C}' + . '\x{900D}\x{900F}\x{9010}\x{9011}\x{9012}\x{9013}\x{9014}\x{9015}\x{9016}' + . '\x{9017}\x{9018}\x{9019}\x{901A}\x{901B}\x{901C}\x{901D}\x{901E}\x{901F}' + . '\x{9020}\x{9021}\x{9022}\x{9023}\x{9024}\x{9025}\x{9026}\x{9027}\x{9028}' + . '\x{9029}\x{902B}\x{902D}\x{902E}\x{902F}\x{9030}\x{9031}\x{9032}\x{9033}' + . '\x{9034}\x{9035}\x{9036}\x{9038}\x{903A}\x{903B}\x{903C}\x{903D}\x{903E}' + . '\x{903F}\x{9041}\x{9042}\x{9043}\x{9044}\x{9045}\x{9047}\x{9048}\x{9049}' + . '\x{904A}\x{904B}\x{904C}\x{904D}\x{904E}\x{904F}\x{9050}\x{9051}\x{9052}' + . '\x{9053}\x{9054}\x{9055}\x{9056}\x{9057}\x{9058}\x{9059}\x{905A}\x{905B}' + . '\x{905C}\x{905D}\x{905E}\x{905F}\x{9060}\x{9061}\x{9062}\x{9063}\x{9064}' + . '\x{9065}\x{9066}\x{9067}\x{9068}\x{9069}\x{906A}\x{906B}\x{906C}\x{906D}' + . '\x{906E}\x{906F}\x{9070}\x{9071}\x{9072}\x{9073}\x{9074}\x{9075}\x{9076}' + . '\x{9077}\x{9078}\x{9079}\x{907A}\x{907B}\x{907C}\x{907D}\x{907E}\x{907F}' + . '\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9085}\x{9086}\x{9087}\x{9088}' + . '\x{9089}\x{908A}\x{908B}\x{908C}\x{908D}\x{908E}\x{908F}\x{9090}\x{9091}' + . '\x{9092}\x{9093}\x{9094}\x{9095}\x{9096}\x{9097}\x{9098}\x{9099}\x{909A}' + . '\x{909B}\x{909C}\x{909D}\x{909E}\x{909F}\x{90A0}\x{90A1}\x{90A2}\x{90A3}' + . '\x{90A4}\x{90A5}\x{90A6}\x{90A7}\x{90A8}\x{90A9}\x{90AA}\x{90AC}\x{90AD}' + . '\x{90AE}\x{90AF}\x{90B0}\x{90B1}\x{90B2}\x{90B3}\x{90B4}\x{90B5}\x{90B6}' + . '\x{90B7}\x{90B8}\x{90B9}\x{90BA}\x{90BB}\x{90BC}\x{90BD}\x{90BE}\x{90BF}' + . '\x{90C0}\x{90C1}\x{90C2}\x{90C3}\x{90C4}\x{90C5}\x{90C6}\x{90C7}\x{90C8}' + . '\x{90C9}\x{90CA}\x{90CB}\x{90CE}\x{90CF}\x{90D0}\x{90D1}\x{90D3}\x{90D4}' + . '\x{90D5}\x{90D6}\x{90D7}\x{90D8}\x{90D9}\x{90DA}\x{90DB}\x{90DC}\x{90DD}' + . '\x{90DE}\x{90DF}\x{90E0}\x{90E1}\x{90E2}\x{90E3}\x{90E4}\x{90E5}\x{90E6}' + . '\x{90E7}\x{90E8}\x{90E9}\x{90EA}\x{90EB}\x{90EC}\x{90ED}\x{90EE}\x{90EF}' + . '\x{90F0}\x{90F1}\x{90F2}\x{90F3}\x{90F4}\x{90F5}\x{90F7}\x{90F8}\x{90F9}' + . '\x{90FA}\x{90FB}\x{90FC}\x{90FD}\x{90FE}\x{90FF}\x{9100}\x{9101}\x{9102}' + . '\x{9103}\x{9104}\x{9105}\x{9106}\x{9107}\x{9108}\x{9109}\x{910B}\x{910C}' + . '\x{910D}\x{910E}\x{910F}\x{9110}\x{9111}\x{9112}\x{9113}\x{9114}\x{9115}' + . '\x{9116}\x{9117}\x{9118}\x{9119}\x{911A}\x{911B}\x{911C}\x{911D}\x{911E}' + . '\x{911F}\x{9120}\x{9121}\x{9122}\x{9123}\x{9124}\x{9125}\x{9126}\x{9127}' + . '\x{9128}\x{9129}\x{912A}\x{912B}\x{912C}\x{912D}\x{912E}\x{912F}\x{9130}' + . '\x{9131}\x{9132}\x{9133}\x{9134}\x{9135}\x{9136}\x{9137}\x{9138}\x{9139}' + . '\x{913A}\x{913B}\x{913E}\x{913F}\x{9140}\x{9141}\x{9142}\x{9143}\x{9144}' + . '\x{9145}\x{9146}\x{9147}\x{9148}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}' + . '\x{914E}\x{914F}\x{9150}\x{9151}\x{9152}\x{9153}\x{9154}\x{9155}\x{9156}' + . '\x{9157}\x{9158}\x{915A}\x{915B}\x{915C}\x{915D}\x{915E}\x{915F}\x{9160}' + . '\x{9161}\x{9162}\x{9163}\x{9164}\x{9165}\x{9166}\x{9167}\x{9168}\x{9169}' + . '\x{916A}\x{916B}\x{916C}\x{916D}\x{916E}\x{916F}\x{9170}\x{9171}\x{9172}' + . '\x{9173}\x{9174}\x{9175}\x{9176}\x{9177}\x{9178}\x{9179}\x{917A}\x{917C}' + . '\x{917D}\x{917E}\x{917F}\x{9180}\x{9181}\x{9182}\x{9183}\x{9184}\x{9185}' + . '\x{9186}\x{9187}\x{9188}\x{9189}\x{918A}\x{918B}\x{918C}\x{918D}\x{918E}' + . '\x{918F}\x{9190}\x{9191}\x{9192}\x{9193}\x{9194}\x{9196}\x{9199}\x{919A}' + . '\x{919B}\x{919C}\x{919D}\x{919E}\x{919F}\x{91A0}\x{91A1}\x{91A2}\x{91A3}' + . '\x{91A5}\x{91A6}\x{91A7}\x{91A8}\x{91AA}\x{91AB}\x{91AC}\x{91AD}\x{91AE}' + . '\x{91AF}\x{91B0}\x{91B1}\x{91B2}\x{91B3}\x{91B4}\x{91B5}\x{91B6}\x{91B7}' + . '\x{91B9}\x{91BA}\x{91BB}\x{91BC}\x{91BD}\x{91BE}\x{91C0}\x{91C1}\x{91C2}' + . '\x{91C3}\x{91C5}\x{91C6}\x{91C7}\x{91C9}\x{91CA}\x{91CB}\x{91CC}\x{91CD}' + . '\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D2}\x{91D3}\x{91D4}\x{91D5}\x{91D7}' + . '\x{91D8}\x{91D9}\x{91DA}\x{91DB}\x{91DC}\x{91DD}\x{91DE}\x{91DF}\x{91E2}' + . '\x{91E3}\x{91E4}\x{91E5}\x{91E6}\x{91E7}\x{91E8}\x{91E9}\x{91EA}\x{91EB}' + . '\x{91EC}\x{91ED}\x{91EE}\x{91F0}\x{91F1}\x{91F2}\x{91F3}\x{91F4}\x{91F5}' + . '\x{91F7}\x{91F8}\x{91F9}\x{91FA}\x{91FB}\x{91FD}\x{91FE}\x{91FF}\x{9200}' + . '\x{9201}\x{9202}\x{9203}\x{9204}\x{9205}\x{9206}\x{9207}\x{9208}\x{9209}' + . '\x{920A}\x{920B}\x{920C}\x{920D}\x{920E}\x{920F}\x{9210}\x{9211}\x{9212}' + . '\x{9214}\x{9215}\x{9216}\x{9217}\x{9218}\x{9219}\x{921A}\x{921B}\x{921C}' + . '\x{921D}\x{921E}\x{9220}\x{9221}\x{9223}\x{9224}\x{9225}\x{9226}\x{9227}' + . '\x{9228}\x{9229}\x{922A}\x{922B}\x{922D}\x{922E}\x{922F}\x{9230}\x{9231}' + . '\x{9232}\x{9233}\x{9234}\x{9235}\x{9236}\x{9237}\x{9238}\x{9239}\x{923A}' + . '\x{923B}\x{923C}\x{923D}\x{923E}\x{923F}\x{9240}\x{9241}\x{9242}\x{9245}' + . '\x{9246}\x{9247}\x{9248}\x{9249}\x{924A}\x{924B}\x{924C}\x{924D}\x{924E}' + . '\x{924F}\x{9250}\x{9251}\x{9252}\x{9253}\x{9254}\x{9255}\x{9256}\x{9257}' + . '\x{9258}\x{9259}\x{925A}\x{925B}\x{925C}\x{925D}\x{925E}\x{925F}\x{9260}' + . '\x{9261}\x{9262}\x{9263}\x{9264}\x{9265}\x{9266}\x{9267}\x{9268}\x{926B}' + . '\x{926C}\x{926D}\x{926E}\x{926F}\x{9270}\x{9272}\x{9273}\x{9274}\x{9275}' + . '\x{9276}\x{9277}\x{9278}\x{9279}\x{927A}\x{927B}\x{927C}\x{927D}\x{927E}' + . '\x{927F}\x{9280}\x{9282}\x{9283}\x{9285}\x{9286}\x{9287}\x{9288}\x{9289}' + . '\x{928A}\x{928B}\x{928C}\x{928D}\x{928E}\x{928F}\x{9290}\x{9291}\x{9292}' + . '\x{9293}\x{9294}\x{9295}\x{9296}\x{9297}\x{9298}\x{9299}\x{929A}\x{929B}' + . '\x{929C}\x{929D}\x{929F}\x{92A0}\x{92A1}\x{92A2}\x{92A3}\x{92A4}\x{92A5}' + . '\x{92A6}\x{92A7}\x{92A8}\x{92A9}\x{92AA}\x{92AB}\x{92AC}\x{92AD}\x{92AE}' + . '\x{92AF}\x{92B0}\x{92B1}\x{92B2}\x{92B3}\x{92B4}\x{92B5}\x{92B6}\x{92B7}' + . '\x{92B8}\x{92B9}\x{92BA}\x{92BB}\x{92BC}\x{92BE}\x{92BF}\x{92C0}\x{92C1}' + . '\x{92C2}\x{92C3}\x{92C4}\x{92C5}\x{92C6}\x{92C7}\x{92C8}\x{92C9}\x{92CA}' + . '\x{92CB}\x{92CC}\x{92CD}\x{92CE}\x{92CF}\x{92D0}\x{92D1}\x{92D2}\x{92D3}' + . '\x{92D5}\x{92D6}\x{92D7}\x{92D8}\x{92D9}\x{92DA}\x{92DC}\x{92DD}\x{92DE}' + . '\x{92DF}\x{92E0}\x{92E1}\x{92E3}\x{92E4}\x{92E5}\x{92E6}\x{92E7}\x{92E8}' + . '\x{92E9}\x{92EA}\x{92EB}\x{92EC}\x{92ED}\x{92EE}\x{92EF}\x{92F0}\x{92F1}' + . '\x{92F2}\x{92F3}\x{92F4}\x{92F5}\x{92F6}\x{92F7}\x{92F8}\x{92F9}\x{92FA}' + . '\x{92FB}\x{92FC}\x{92FD}\x{92FE}\x{92FF}\x{9300}\x{9301}\x{9302}\x{9303}' + . '\x{9304}\x{9305}\x{9306}\x{9307}\x{9308}\x{9309}\x{930A}\x{930B}\x{930C}' + . '\x{930D}\x{930E}\x{930F}\x{9310}\x{9311}\x{9312}\x{9313}\x{9314}\x{9315}' + . '\x{9316}\x{9317}\x{9318}\x{9319}\x{931A}\x{931B}\x{931D}\x{931E}\x{931F}' + . '\x{9320}\x{9321}\x{9322}\x{9323}\x{9324}\x{9325}\x{9326}\x{9327}\x{9328}' + . '\x{9329}\x{932A}\x{932B}\x{932D}\x{932E}\x{932F}\x{9332}\x{9333}\x{9334}' + . '\x{9335}\x{9336}\x{9337}\x{9338}\x{9339}\x{933A}\x{933B}\x{933C}\x{933D}' + . '\x{933E}\x{933F}\x{9340}\x{9341}\x{9342}\x{9343}\x{9344}\x{9345}\x{9346}' + . '\x{9347}\x{9348}\x{9349}\x{934A}\x{934B}\x{934C}\x{934D}\x{934E}\x{934F}' + . '\x{9350}\x{9351}\x{9352}\x{9353}\x{9354}\x{9355}\x{9356}\x{9357}\x{9358}' + . '\x{9359}\x{935A}\x{935B}\x{935C}\x{935D}\x{935E}\x{935F}\x{9360}\x{9361}' + . '\x{9363}\x{9364}\x{9365}\x{9366}\x{9367}\x{9369}\x{936A}\x{936C}\x{936D}' + . '\x{936E}\x{9370}\x{9371}\x{9372}\x{9374}\x{9375}\x{9376}\x{9377}\x{9379}' + . '\x{937A}\x{937B}\x{937C}\x{937D}\x{937E}\x{9380}\x{9382}\x{9383}\x{9384}' + . '\x{9385}\x{9386}\x{9387}\x{9388}\x{9389}\x{938A}\x{938C}\x{938D}\x{938E}' + . '\x{938F}\x{9390}\x{9391}\x{9392}\x{9393}\x{9394}\x{9395}\x{9396}\x{9397}' + . '\x{9398}\x{9399}\x{939A}\x{939B}\x{939D}\x{939E}\x{939F}\x{93A1}\x{93A2}' + . '\x{93A3}\x{93A4}\x{93A5}\x{93A6}\x{93A7}\x{93A8}\x{93A9}\x{93AA}\x{93AC}' + . '\x{93AD}\x{93AE}\x{93AF}\x{93B0}\x{93B1}\x{93B2}\x{93B3}\x{93B4}\x{93B5}' + . '\x{93B6}\x{93B7}\x{93B8}\x{93B9}\x{93BA}\x{93BC}\x{93BD}\x{93BE}\x{93BF}' + . '\x{93C0}\x{93C1}\x{93C2}\x{93C3}\x{93C4}\x{93C5}\x{93C6}\x{93C7}\x{93C8}' + . '\x{93C9}\x{93CA}\x{93CB}\x{93CC}\x{93CD}\x{93CE}\x{93CF}\x{93D0}\x{93D1}' + . '\x{93D2}\x{93D3}\x{93D4}\x{93D5}\x{93D6}\x{93D7}\x{93D8}\x{93D9}\x{93DA}' + . '\x{93DB}\x{93DC}\x{93DD}\x{93DE}\x{93DF}\x{93E1}\x{93E2}\x{93E3}\x{93E4}' + . '\x{93E6}\x{93E7}\x{93E8}\x{93E9}\x{93EA}\x{93EB}\x{93EC}\x{93ED}\x{93EE}' + . '\x{93EF}\x{93F0}\x{93F1}\x{93F2}\x{93F4}\x{93F5}\x{93F6}\x{93F7}\x{93F8}' + . '\x{93F9}\x{93FA}\x{93FB}\x{93FC}\x{93FD}\x{93FE}\x{93FF}\x{9400}\x{9401}' + . '\x{9403}\x{9404}\x{9405}\x{9406}\x{9407}\x{9408}\x{9409}\x{940A}\x{940B}' + . '\x{940C}\x{940D}\x{940E}\x{940F}\x{9410}\x{9411}\x{9412}\x{9413}\x{9414}' + . '\x{9415}\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}\x{9422}\x{9423}' + . '\x{9425}\x{9426}\x{9427}\x{9428}\x{9429}\x{942A}\x{942B}\x{942C}\x{942D}' + . '\x{942E}\x{942F}\x{9430}\x{9431}\x{9432}\x{9433}\x{9434}\x{9435}\x{9436}' + . '\x{9437}\x{9438}\x{9439}\x{943A}\x{943B}\x{943C}\x{943D}\x{943E}\x{943F}' + . '\x{9440}\x{9441}\x{9442}\x{9444}\x{9445}\x{9446}\x{9447}\x{9448}\x{9449}' + . '\x{944A}\x{944B}\x{944C}\x{944D}\x{944F}\x{9450}\x{9451}\x{9452}\x{9453}' + . '\x{9454}\x{9455}\x{9456}\x{9457}\x{9458}\x{9459}\x{945B}\x{945C}\x{945D}' + . '\x{945E}\x{945F}\x{9460}\x{9461}\x{9462}\x{9463}\x{9464}\x{9465}\x{9466}' + . '\x{9467}\x{9468}\x{9469}\x{946A}\x{946B}\x{946D}\x{946E}\x{946F}\x{9470}' + . '\x{9471}\x{9472}\x{9473}\x{9474}\x{9475}\x{9476}\x{9477}\x{9478}\x{9479}' + . '\x{947A}\x{947C}\x{947D}\x{947E}\x{947F}\x{9480}\x{9481}\x{9482}\x{9483}' + . '\x{9484}\x{9485}\x{9486}\x{9487}\x{9488}\x{9489}\x{948A}\x{948B}\x{948C}' + . '\x{948D}\x{948E}\x{948F}\x{9490}\x{9491}\x{9492}\x{9493}\x{9494}\x{9495}' + . '\x{9496}\x{9497}\x{9498}\x{9499}\x{949A}\x{949B}\x{949C}\x{949D}\x{949E}' + . '\x{949F}\x{94A0}\x{94A1}\x{94A2}\x{94A3}\x{94A4}\x{94A5}\x{94A6}\x{94A7}' + . '\x{94A8}\x{94A9}\x{94AA}\x{94AB}\x{94AC}\x{94AD}\x{94AE}\x{94AF}\x{94B0}' + . '\x{94B1}\x{94B2}\x{94B3}\x{94B4}\x{94B5}\x{94B6}\x{94B7}\x{94B8}\x{94B9}' + . '\x{94BA}\x{94BB}\x{94BC}\x{94BD}\x{94BE}\x{94BF}\x{94C0}\x{94C1}\x{94C2}' + . '\x{94C3}\x{94C4}\x{94C5}\x{94C6}\x{94C7}\x{94C8}\x{94C9}\x{94CA}\x{94CB}' + . '\x{94CC}\x{94CD}\x{94CE}\x{94CF}\x{94D0}\x{94D1}\x{94D2}\x{94D3}\x{94D4}' + . '\x{94D5}\x{94D6}\x{94D7}\x{94D8}\x{94D9}\x{94DA}\x{94DB}\x{94DC}\x{94DD}' + . '\x{94DE}\x{94DF}\x{94E0}\x{94E1}\x{94E2}\x{94E3}\x{94E4}\x{94E5}\x{94E6}' + . '\x{94E7}\x{94E8}\x{94E9}\x{94EA}\x{94EB}\x{94EC}\x{94ED}\x{94EE}\x{94EF}' + . '\x{94F0}\x{94F1}\x{94F2}\x{94F3}\x{94F4}\x{94F5}\x{94F6}\x{94F7}\x{94F8}' + . '\x{94F9}\x{94FA}\x{94FB}\x{94FC}\x{94FD}\x{94FE}\x{94FF}\x{9500}\x{9501}' + . '\x{9502}\x{9503}\x{9504}\x{9505}\x{9506}\x{9507}\x{9508}\x{9509}\x{950A}' + . '\x{950B}\x{950C}\x{950D}\x{950E}\x{950F}\x{9510}\x{9511}\x{9512}\x{9513}' + . '\x{9514}\x{9515}\x{9516}\x{9517}\x{9518}\x{9519}\x{951A}\x{951B}\x{951C}' + . '\x{951D}\x{951E}\x{951F}\x{9520}\x{9521}\x{9522}\x{9523}\x{9524}\x{9525}' + . '\x{9526}\x{9527}\x{9528}\x{9529}\x{952A}\x{952B}\x{952C}\x{952D}\x{952E}' + . '\x{952F}\x{9530}\x{9531}\x{9532}\x{9533}\x{9534}\x{9535}\x{9536}\x{9537}' + . '\x{9538}\x{9539}\x{953A}\x{953B}\x{953C}\x{953D}\x{953E}\x{953F}\x{9540}' + . '\x{9541}\x{9542}\x{9543}\x{9544}\x{9545}\x{9546}\x{9547}\x{9548}\x{9549}' + . '\x{954A}\x{954B}\x{954C}\x{954D}\x{954E}\x{954F}\x{9550}\x{9551}\x{9552}' + . '\x{9553}\x{9554}\x{9555}\x{9556}\x{9557}\x{9558}\x{9559}\x{955A}\x{955B}' + . '\x{955C}\x{955D}\x{955E}\x{955F}\x{9560}\x{9561}\x{9562}\x{9563}\x{9564}' + . '\x{9565}\x{9566}\x{9567}\x{9568}\x{9569}\x{956A}\x{956B}\x{956C}\x{956D}' + . '\x{956E}\x{956F}\x{9570}\x{9571}\x{9572}\x{9573}\x{9574}\x{9575}\x{9576}' + . '\x{9577}\x{957A}\x{957B}\x{957C}\x{957D}\x{957F}\x{9580}\x{9581}\x{9582}' + . '\x{9583}\x{9584}\x{9586}\x{9587}\x{9588}\x{9589}\x{958A}\x{958B}\x{958C}' + . '\x{958D}\x{958E}\x{958F}\x{9590}\x{9591}\x{9592}\x{9593}\x{9594}\x{9595}' + . '\x{9596}\x{9598}\x{9599}\x{959A}\x{959B}\x{959C}\x{959D}\x{959E}\x{959F}' + . '\x{95A1}\x{95A2}\x{95A3}\x{95A4}\x{95A5}\x{95A6}\x{95A7}\x{95A8}\x{95A9}' + . '\x{95AA}\x{95AB}\x{95AC}\x{95AD}\x{95AE}\x{95AF}\x{95B0}\x{95B1}\x{95B2}' + . '\x{95B5}\x{95B6}\x{95B7}\x{95B9}\x{95BA}\x{95BB}\x{95BC}\x{95BD}\x{95BE}' + . '\x{95BF}\x{95C0}\x{95C2}\x{95C3}\x{95C4}\x{95C5}\x{95C6}\x{95C7}\x{95C8}' + . '\x{95C9}\x{95CA}\x{95CB}\x{95CC}\x{95CD}\x{95CE}\x{95CF}\x{95D0}\x{95D1}' + . '\x{95D2}\x{95D3}\x{95D4}\x{95D5}\x{95D6}\x{95D7}\x{95D8}\x{95DA}\x{95DB}' + . '\x{95DC}\x{95DE}\x{95DF}\x{95E0}\x{95E1}\x{95E2}\x{95E3}\x{95E4}\x{95E5}' + . '\x{95E6}\x{95E7}\x{95E8}\x{95E9}\x{95EA}\x{95EB}\x{95EC}\x{95ED}\x{95EE}' + . '\x{95EF}\x{95F0}\x{95F1}\x{95F2}\x{95F3}\x{95F4}\x{95F5}\x{95F6}\x{95F7}' + . '\x{95F8}\x{95F9}\x{95FA}\x{95FB}\x{95FC}\x{95FD}\x{95FE}\x{95FF}\x{9600}' + . '\x{9601}\x{9602}\x{9603}\x{9604}\x{9605}\x{9606}\x{9607}\x{9608}\x{9609}' + . '\x{960A}\x{960B}\x{960C}\x{960D}\x{960E}\x{960F}\x{9610}\x{9611}\x{9612}' + . '\x{9613}\x{9614}\x{9615}\x{9616}\x{9617}\x{9618}\x{9619}\x{961A}\x{961B}' + . '\x{961C}\x{961D}\x{961E}\x{961F}\x{9620}\x{9621}\x{9622}\x{9623}\x{9624}' + . '\x{9627}\x{9628}\x{962A}\x{962B}\x{962C}\x{962D}\x{962E}\x{962F}\x{9630}' + . '\x{9631}\x{9632}\x{9633}\x{9634}\x{9635}\x{9636}\x{9637}\x{9638}\x{9639}' + . '\x{963A}\x{963B}\x{963C}\x{963D}\x{963F}\x{9640}\x{9641}\x{9642}\x{9643}' + . '\x{9644}\x{9645}\x{9646}\x{9647}\x{9648}\x{9649}\x{964A}\x{964B}\x{964C}' + . '\x{964D}\x{964E}\x{964F}\x{9650}\x{9651}\x{9652}\x{9653}\x{9654}\x{9655}' + . '\x{9658}\x{9659}\x{965A}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9660}' + . '\x{9661}\x{9662}\x{9663}\x{9664}\x{9666}\x{9667}\x{9668}\x{9669}\x{966A}' + . '\x{966B}\x{966C}\x{966D}\x{966E}\x{966F}\x{9670}\x{9671}\x{9672}\x{9673}' + . '\x{9674}\x{9675}\x{9676}\x{9677}\x{9678}\x{967C}\x{967D}\x{967E}\x{9680}' + . '\x{9683}\x{9684}\x{9685}\x{9686}\x{9687}\x{9688}\x{9689}\x{968A}\x{968B}' + . '\x{968D}\x{968E}\x{968F}\x{9690}\x{9691}\x{9692}\x{9693}\x{9694}\x{9695}' + . '\x{9697}\x{9698}\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}\x{96A1}\x{96A2}' + . '\x{96A3}\x{96A4}\x{96A5}\x{96A6}\x{96A7}\x{96A8}\x{96A9}\x{96AA}\x{96AC}' + . '\x{96AD}\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}\x{96B7}\x{96B8}' + . '\x{96B9}\x{96BA}\x{96BB}\x{96BC}\x{96BD}\x{96BE}\x{96BF}\x{96C0}\x{96C1}' + . '\x{96C2}\x{96C3}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C8}\x{96C9}\x{96CA}' + . '\x{96CB}\x{96CC}\x{96CD}\x{96CE}\x{96CF}\x{96D0}\x{96D1}\x{96D2}\x{96D3}' + . '\x{96D4}\x{96D5}\x{96D6}\x{96D7}\x{96D8}\x{96D9}\x{96DA}\x{96DB}\x{96DC}' + . '\x{96DD}\x{96DE}\x{96DF}\x{96E0}\x{96E1}\x{96E2}\x{96E3}\x{96E5}\x{96E8}' + . '\x{96E9}\x{96EA}\x{96EB}\x{96EC}\x{96ED}\x{96EE}\x{96EF}\x{96F0}\x{96F1}' + . '\x{96F2}\x{96F3}\x{96F4}\x{96F5}\x{96F6}\x{96F7}\x{96F8}\x{96F9}\x{96FA}' + . '\x{96FB}\x{96FD}\x{96FE}\x{96FF}\x{9700}\x{9701}\x{9702}\x{9703}\x{9704}' + . '\x{9705}\x{9706}\x{9707}\x{9708}\x{9709}\x{970A}\x{970B}\x{970C}\x{970D}' + . '\x{970E}\x{970F}\x{9710}\x{9711}\x{9712}\x{9713}\x{9715}\x{9716}\x{9718}' + . '\x{9719}\x{971C}\x{971D}\x{971E}\x{971F}\x{9720}\x{9721}\x{9722}\x{9723}' + . '\x{9724}\x{9725}\x{9726}\x{9727}\x{9728}\x{9729}\x{972A}\x{972B}\x{972C}' + . '\x{972D}\x{972E}\x{972F}\x{9730}\x{9731}\x{9732}\x{9735}\x{9736}\x{9738}' + . '\x{9739}\x{973A}\x{973B}\x{973C}\x{973D}\x{973E}\x{973F}\x{9742}\x{9743}' + . '\x{9744}\x{9745}\x{9746}\x{9747}\x{9748}\x{9749}\x{974A}\x{974B}\x{974C}' + . '\x{974E}\x{974F}\x{9750}\x{9751}\x{9752}\x{9753}\x{9754}\x{9755}\x{9756}' + . '\x{9758}\x{9759}\x{975A}\x{975B}\x{975C}\x{975D}\x{975E}\x{975F}\x{9760}' + . '\x{9761}\x{9762}\x{9765}\x{9766}\x{9767}\x{9768}\x{9769}\x{976A}\x{976B}' + . '\x{976C}\x{976D}\x{976E}\x{976F}\x{9770}\x{9772}\x{9773}\x{9774}\x{9776}' + . '\x{9777}\x{9778}\x{9779}\x{977A}\x{977B}\x{977C}\x{977D}\x{977E}\x{977F}' + . '\x{9780}\x{9781}\x{9782}\x{9783}\x{9784}\x{9785}\x{9786}\x{9788}\x{978A}' + . '\x{978B}\x{978C}\x{978D}\x{978E}\x{978F}\x{9790}\x{9791}\x{9792}\x{9793}' + . '\x{9794}\x{9795}\x{9796}\x{9797}\x{9798}\x{9799}\x{979A}\x{979C}\x{979D}' + . '\x{979E}\x{979F}\x{97A0}\x{97A1}\x{97A2}\x{97A3}\x{97A4}\x{97A5}\x{97A6}' + . '\x{97A7}\x{97A8}\x{97AA}\x{97AB}\x{97AC}\x{97AD}\x{97AE}\x{97AF}\x{97B2}' + . '\x{97B3}\x{97B4}\x{97B6}\x{97B7}\x{97B8}\x{97B9}\x{97BA}\x{97BB}\x{97BC}' + . '\x{97BD}\x{97BF}\x{97C1}\x{97C2}\x{97C3}\x{97C4}\x{97C5}\x{97C6}\x{97C7}' + . '\x{97C8}\x{97C9}\x{97CA}\x{97CB}\x{97CC}\x{97CD}\x{97CE}\x{97CF}\x{97D0}' + . '\x{97D1}\x{97D3}\x{97D4}\x{97D5}\x{97D6}\x{97D7}\x{97D8}\x{97D9}\x{97DA}' + . '\x{97DB}\x{97DC}\x{97DD}\x{97DE}\x{97DF}\x{97E0}\x{97E1}\x{97E2}\x{97E3}' + . '\x{97E4}\x{97E5}\x{97E6}\x{97E7}\x{97E8}\x{97E9}\x{97EA}\x{97EB}\x{97EC}' + . '\x{97ED}\x{97EE}\x{97EF}\x{97F0}\x{97F1}\x{97F2}\x{97F3}\x{97F4}\x{97F5}' + . '\x{97F6}\x{97F7}\x{97F8}\x{97F9}\x{97FA}\x{97FB}\x{97FD}\x{97FE}\x{97FF}' + . '\x{9800}\x{9801}\x{9802}\x{9803}\x{9804}\x{9805}\x{9806}\x{9807}\x{9808}' + . '\x{9809}\x{980A}\x{980B}\x{980C}\x{980D}\x{980E}\x{980F}\x{9810}\x{9811}' + . '\x{9812}\x{9813}\x{9814}\x{9815}\x{9816}\x{9817}\x{9818}\x{9819}\x{981A}' + . '\x{981B}\x{981C}\x{981D}\x{981E}\x{9820}\x{9821}\x{9822}\x{9823}\x{9824}' + . '\x{9826}\x{9827}\x{9828}\x{9829}\x{982B}\x{982D}\x{982E}\x{982F}\x{9830}' + . '\x{9831}\x{9832}\x{9834}\x{9835}\x{9836}\x{9837}\x{9838}\x{9839}\x{983B}' + . '\x{983C}\x{983D}\x{983F}\x{9840}\x{9841}\x{9843}\x{9844}\x{9845}\x{9846}' + . '\x{9848}\x{9849}\x{984A}\x{984C}\x{984D}\x{984E}\x{984F}\x{9850}\x{9851}' + . '\x{9852}\x{9853}\x{9854}\x{9855}\x{9857}\x{9858}\x{9859}\x{985A}\x{985B}' + . '\x{985C}\x{985D}\x{985E}\x{985F}\x{9860}\x{9861}\x{9862}\x{9863}\x{9864}' + . '\x{9865}\x{9867}\x{9869}\x{986A}\x{986B}\x{986C}\x{986D}\x{986E}\x{986F}' + . '\x{9870}\x{9871}\x{9872}\x{9873}\x{9874}\x{9875}\x{9876}\x{9877}\x{9878}' + . '\x{9879}\x{987A}\x{987B}\x{987C}\x{987D}\x{987E}\x{987F}\x{9880}\x{9881}' + . '\x{9882}\x{9883}\x{9884}\x{9885}\x{9886}\x{9887}\x{9888}\x{9889}\x{988A}' + . '\x{988B}\x{988C}\x{988D}\x{988E}\x{988F}\x{9890}\x{9891}\x{9892}\x{9893}' + . '\x{9894}\x{9895}\x{9896}\x{9897}\x{9898}\x{9899}\x{989A}\x{989B}\x{989C}' + . '\x{989D}\x{989E}\x{989F}\x{98A0}\x{98A1}\x{98A2}\x{98A3}\x{98A4}\x{98A5}' + . '\x{98A6}\x{98A7}\x{98A8}\x{98A9}\x{98AA}\x{98AB}\x{98AC}\x{98AD}\x{98AE}' + . '\x{98AF}\x{98B0}\x{98B1}\x{98B2}\x{98B3}\x{98B4}\x{98B5}\x{98B6}\x{98B8}' + . '\x{98B9}\x{98BA}\x{98BB}\x{98BC}\x{98BD}\x{98BE}\x{98BF}\x{98C0}\x{98C1}' + . '\x{98C2}\x{98C3}\x{98C4}\x{98C5}\x{98C6}\x{98C8}\x{98C9}\x{98CB}\x{98CC}' + . '\x{98CD}\x{98CE}\x{98CF}\x{98D0}\x{98D1}\x{98D2}\x{98D3}\x{98D4}\x{98D5}' + . '\x{98D6}\x{98D7}\x{98D8}\x{98D9}\x{98DA}\x{98DB}\x{98DC}\x{98DD}\x{98DE}' + . '\x{98DF}\x{98E0}\x{98E2}\x{98E3}\x{98E5}\x{98E6}\x{98E7}\x{98E8}\x{98E9}' + . '\x{98EA}\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}\x{98F3}\x{98F4}\x{98F5}' + . '\x{98F6}\x{98F7}\x{98F9}\x{98FA}\x{98FC}\x{98FD}\x{98FE}\x{98FF}\x{9900}' + . '\x{9901}\x{9902}\x{9903}\x{9904}\x{9905}\x{9906}\x{9907}\x{9908}\x{9909}' + . '\x{990A}\x{990B}\x{990C}\x{990D}\x{990E}\x{990F}\x{9910}\x{9911}\x{9912}' + . '\x{9913}\x{9914}\x{9915}\x{9916}\x{9917}\x{9918}\x{991A}\x{991B}\x{991C}' + . '\x{991D}\x{991E}\x{991F}\x{9920}\x{9921}\x{9922}\x{9923}\x{9924}\x{9925}' + . '\x{9926}\x{9927}\x{9928}\x{9929}\x{992A}\x{992B}\x{992C}\x{992D}\x{992E}' + . '\x{992F}\x{9930}\x{9931}\x{9932}\x{9933}\x{9934}\x{9935}\x{9936}\x{9937}' + . '\x{9938}\x{9939}\x{993A}\x{993C}\x{993D}\x{993E}\x{993F}\x{9940}\x{9941}' + . '\x{9942}\x{9943}\x{9945}\x{9946}\x{9947}\x{9948}\x{9949}\x{994A}\x{994B}' + . '\x{994C}\x{994E}\x{994F}\x{9950}\x{9951}\x{9952}\x{9953}\x{9954}\x{9955}' + . '\x{9956}\x{9957}\x{9958}\x{9959}\x{995B}\x{995C}\x{995E}\x{995F}\x{9960}' + . '\x{9961}\x{9962}\x{9963}\x{9964}\x{9965}\x{9966}\x{9967}\x{9968}\x{9969}' + . '\x{996A}\x{996B}\x{996C}\x{996D}\x{996E}\x{996F}\x{9970}\x{9971}\x{9972}' + . '\x{9973}\x{9974}\x{9975}\x{9976}\x{9977}\x{9978}\x{9979}\x{997A}\x{997B}' + . '\x{997C}\x{997D}\x{997E}\x{997F}\x{9980}\x{9981}\x{9982}\x{9983}\x{9984}' + . '\x{9985}\x{9986}\x{9987}\x{9988}\x{9989}\x{998A}\x{998B}\x{998C}\x{998D}' + . '\x{998E}\x{998F}\x{9990}\x{9991}\x{9992}\x{9993}\x{9994}\x{9995}\x{9996}' + . '\x{9997}\x{9998}\x{9999}\x{999A}\x{999B}\x{999C}\x{999D}\x{999E}\x{999F}' + . '\x{99A0}\x{99A1}\x{99A2}\x{99A3}\x{99A4}\x{99A5}\x{99A6}\x{99A7}\x{99A8}' + . '\x{99A9}\x{99AA}\x{99AB}\x{99AC}\x{99AD}\x{99AE}\x{99AF}\x{99B0}\x{99B1}' + . '\x{99B2}\x{99B3}\x{99B4}\x{99B5}\x{99B6}\x{99B7}\x{99B8}\x{99B9}\x{99BA}' + . '\x{99BB}\x{99BC}\x{99BD}\x{99BE}\x{99C0}\x{99C1}\x{99C2}\x{99C3}\x{99C4}' + . '\x{99C6}\x{99C7}\x{99C8}\x{99C9}\x{99CA}\x{99CB}\x{99CC}\x{99CD}\x{99CE}' + . '\x{99CF}\x{99D0}\x{99D1}\x{99D2}\x{99D3}\x{99D4}\x{99D5}\x{99D6}\x{99D7}' + . '\x{99D8}\x{99D9}\x{99DA}\x{99DB}\x{99DC}\x{99DD}\x{99DE}\x{99DF}\x{99E1}' + . '\x{99E2}\x{99E3}\x{99E4}\x{99E5}\x{99E7}\x{99E8}\x{99E9}\x{99EA}\x{99EC}' + . '\x{99ED}\x{99EE}\x{99EF}\x{99F0}\x{99F1}\x{99F2}\x{99F3}\x{99F4}\x{99F6}' + . '\x{99F7}\x{99F8}\x{99F9}\x{99FA}\x{99FB}\x{99FC}\x{99FD}\x{99FE}\x{99FF}' + . '\x{9A00}\x{9A01}\x{9A02}\x{9A03}\x{9A04}\x{9A05}\x{9A06}\x{9A07}\x{9A08}' + . '\x{9A09}\x{9A0A}\x{9A0B}\x{9A0C}\x{9A0D}\x{9A0E}\x{9A0F}\x{9A11}\x{9A14}' + . '\x{9A15}\x{9A16}\x{9A19}\x{9A1A}\x{9A1B}\x{9A1C}\x{9A1D}\x{9A1E}\x{9A1F}' + . '\x{9A20}\x{9A21}\x{9A22}\x{9A23}\x{9A24}\x{9A25}\x{9A26}\x{9A27}\x{9A29}' + . '\x{9A2A}\x{9A2B}\x{9A2C}\x{9A2D}\x{9A2E}\x{9A2F}\x{9A30}\x{9A31}\x{9A32}' + . '\x{9A33}\x{9A34}\x{9A35}\x{9A36}\x{9A37}\x{9A38}\x{9A39}\x{9A3A}\x{9A3C}' + . '\x{9A3D}\x{9A3E}\x{9A3F}\x{9A40}\x{9A41}\x{9A42}\x{9A43}\x{9A44}\x{9A45}' + . '\x{9A46}\x{9A47}\x{9A48}\x{9A49}\x{9A4A}\x{9A4B}\x{9A4C}\x{9A4D}\x{9A4E}' + . '\x{9A4F}\x{9A50}\x{9A52}\x{9A53}\x{9A54}\x{9A55}\x{9A56}\x{9A57}\x{9A59}' + . '\x{9A5A}\x{9A5B}\x{9A5C}\x{9A5E}\x{9A5F}\x{9A60}\x{9A61}\x{9A62}\x{9A64}' + . '\x{9A65}\x{9A66}\x{9A67}\x{9A68}\x{9A69}\x{9A6A}\x{9A6B}\x{9A6C}\x{9A6D}' + . '\x{9A6E}\x{9A6F}\x{9A70}\x{9A71}\x{9A72}\x{9A73}\x{9A74}\x{9A75}\x{9A76}' + . '\x{9A77}\x{9A78}\x{9A79}\x{9A7A}\x{9A7B}\x{9A7C}\x{9A7D}\x{9A7E}\x{9A7F}' + . '\x{9A80}\x{9A81}\x{9A82}\x{9A83}\x{9A84}\x{9A85}\x{9A86}\x{9A87}\x{9A88}' + . '\x{9A89}\x{9A8A}\x{9A8B}\x{9A8C}\x{9A8D}\x{9A8E}\x{9A8F}\x{9A90}\x{9A91}' + . '\x{9A92}\x{9A93}\x{9A94}\x{9A95}\x{9A96}\x{9A97}\x{9A98}\x{9A99}\x{9A9A}' + . '\x{9A9B}\x{9A9C}\x{9A9D}\x{9A9E}\x{9A9F}\x{9AA0}\x{9AA1}\x{9AA2}\x{9AA3}' + . '\x{9AA4}\x{9AA5}\x{9AA6}\x{9AA7}\x{9AA8}\x{9AAA}\x{9AAB}\x{9AAC}\x{9AAD}' + . '\x{9AAE}\x{9AAF}\x{9AB0}\x{9AB1}\x{9AB2}\x{9AB3}\x{9AB4}\x{9AB5}\x{9AB6}' + . '\x{9AB7}\x{9AB8}\x{9AB9}\x{9ABA}\x{9ABB}\x{9ABC}\x{9ABE}\x{9ABF}\x{9AC0}' + . '\x{9AC1}\x{9AC2}\x{9AC3}\x{9AC4}\x{9AC5}\x{9AC6}\x{9AC7}\x{9AC9}\x{9ACA}' + . '\x{9ACB}\x{9ACC}\x{9ACD}\x{9ACE}\x{9ACF}\x{9AD0}\x{9AD1}\x{9AD2}\x{9AD3}' + . '\x{9AD4}\x{9AD5}\x{9AD6}\x{9AD8}\x{9AD9}\x{9ADA}\x{9ADB}\x{9ADC}\x{9ADD}' + . '\x{9ADE}\x{9ADF}\x{9AE1}\x{9AE2}\x{9AE3}\x{9AE5}\x{9AE6}\x{9AE7}\x{9AEA}' + . '\x{9AEB}\x{9AEC}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF2}\x{9AF3}\x{9AF4}' + . '\x{9AF5}\x{9AF6}\x{9AF7}\x{9AF8}\x{9AF9}\x{9AFA}\x{9AFB}\x{9AFC}\x{9AFD}' + . '\x{9AFE}\x{9AFF}\x{9B01}\x{9B03}\x{9B04}\x{9B05}\x{9B06}\x{9B07}\x{9B08}' + . '\x{9B0A}\x{9B0B}\x{9B0C}\x{9B0D}\x{9B0E}\x{9B0F}\x{9B10}\x{9B11}\x{9B12}' + . '\x{9B13}\x{9B15}\x{9B16}\x{9B17}\x{9B18}\x{9B19}\x{9B1A}\x{9B1C}\x{9B1D}' + . '\x{9B1E}\x{9B1F}\x{9B20}\x{9B21}\x{9B22}\x{9B23}\x{9B24}\x{9B25}\x{9B26}' + . '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2B}\x{9B2C}\x{9B2D}\x{9B2E}\x{9B2F}' + . '\x{9B30}\x{9B31}\x{9B32}\x{9B33}\x{9B35}\x{9B36}\x{9B37}\x{9B38}\x{9B39}' + . '\x{9B3A}\x{9B3B}\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}\x{9B42}\x{9B43}\x{9B44}' + . '\x{9B45}\x{9B46}\x{9B47}\x{9B48}\x{9B49}\x{9B4A}\x{9B4B}\x{9B4C}\x{9B4D}' + . '\x{9B4E}\x{9B4F}\x{9B51}\x{9B52}\x{9B53}\x{9B54}\x{9B55}\x{9B56}\x{9B58}' + . '\x{9B59}\x{9B5A}\x{9B5B}\x{9B5C}\x{9B5D}\x{9B5E}\x{9B5F}\x{9B60}\x{9B61}' + . '\x{9B63}\x{9B64}\x{9B65}\x{9B66}\x{9B67}\x{9B68}\x{9B69}\x{9B6A}\x{9B6B}' + . '\x{9B6C}\x{9B6D}\x{9B6E}\x{9B6F}\x{9B70}\x{9B71}\x{9B73}\x{9B74}\x{9B75}' + . '\x{9B76}\x{9B77}\x{9B78}\x{9B79}\x{9B7A}\x{9B7B}\x{9B7C}\x{9B7D}\x{9B7E}' + . '\x{9B7F}\x{9B80}\x{9B81}\x{9B82}\x{9B83}\x{9B84}\x{9B85}\x{9B86}\x{9B87}' + . '\x{9B88}\x{9B8A}\x{9B8B}\x{9B8D}\x{9B8E}\x{9B8F}\x{9B90}\x{9B91}\x{9B92}' + . '\x{9B93}\x{9B94}\x{9B95}\x{9B96}\x{9B97}\x{9B98}\x{9B9A}\x{9B9B}\x{9B9C}' + . '\x{9B9D}\x{9B9E}\x{9B9F}\x{9BA0}\x{9BA1}\x{9BA2}\x{9BA3}\x{9BA4}\x{9BA5}' + . '\x{9BA6}\x{9BA7}\x{9BA8}\x{9BA9}\x{9BAA}\x{9BAB}\x{9BAC}\x{9BAD}\x{9BAE}' + . '\x{9BAF}\x{9BB0}\x{9BB1}\x{9BB2}\x{9BB3}\x{9BB4}\x{9BB5}\x{9BB6}\x{9BB7}' + . '\x{9BB8}\x{9BB9}\x{9BBA}\x{9BBB}\x{9BBC}\x{9BBD}\x{9BBE}\x{9BBF}\x{9BC0}' + . '\x{9BC1}\x{9BC3}\x{9BC4}\x{9BC5}\x{9BC6}\x{9BC7}\x{9BC8}\x{9BC9}\x{9BCA}' + . '\x{9BCB}\x{9BCC}\x{9BCD}\x{9BCE}\x{9BCF}\x{9BD0}\x{9BD1}\x{9BD2}\x{9BD3}' + . '\x{9BD4}\x{9BD5}\x{9BD6}\x{9BD7}\x{9BD8}\x{9BD9}\x{9BDA}\x{9BDB}\x{9BDC}' + . '\x{9BDD}\x{9BDE}\x{9BDF}\x{9BE0}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}\x{9BE5}' + . '\x{9BE6}\x{9BE7}\x{9BE8}\x{9BE9}\x{9BEA}\x{9BEB}\x{9BEC}\x{9BED}\x{9BEE}' + . '\x{9BEF}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF3}\x{9BF4}\x{9BF5}\x{9BF7}\x{9BF8}' + . '\x{9BF9}\x{9BFA}\x{9BFB}\x{9BFC}\x{9BFD}\x{9BFE}\x{9BFF}\x{9C02}\x{9C05}' + . '\x{9C06}\x{9C07}\x{9C08}\x{9C09}\x{9C0A}\x{9C0B}\x{9C0C}\x{9C0D}\x{9C0E}' + . '\x{9C0F}\x{9C10}\x{9C11}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C16}\x{9C17}' + . '\x{9C18}\x{9C19}\x{9C1A}\x{9C1B}\x{9C1C}\x{9C1D}\x{9C1E}\x{9C1F}\x{9C20}' + . '\x{9C21}\x{9C22}\x{9C23}\x{9C24}\x{9C25}\x{9C26}\x{9C27}\x{9C28}\x{9C29}' + . '\x{9C2A}\x{9C2B}\x{9C2C}\x{9C2D}\x{9C2F}\x{9C30}\x{9C31}\x{9C32}\x{9C33}' + . '\x{9C34}\x{9C35}\x{9C36}\x{9C37}\x{9C38}\x{9C39}\x{9C3A}\x{9C3B}\x{9C3C}' + . '\x{9C3D}\x{9C3E}\x{9C3F}\x{9C40}\x{9C41}\x{9C43}\x{9C44}\x{9C45}\x{9C46}' + . '\x{9C47}\x{9C48}\x{9C49}\x{9C4A}\x{9C4B}\x{9C4C}\x{9C4D}\x{9C4E}\x{9C50}' + . '\x{9C52}\x{9C53}\x{9C54}\x{9C55}\x{9C56}\x{9C57}\x{9C58}\x{9C59}\x{9C5A}' + . '\x{9C5B}\x{9C5C}\x{9C5D}\x{9C5E}\x{9C5F}\x{9C60}\x{9C62}\x{9C63}\x{9C65}' + . '\x{9C66}\x{9C67}\x{9C68}\x{9C69}\x{9C6A}\x{9C6B}\x{9C6C}\x{9C6D}\x{9C6E}' + . '\x{9C6F}\x{9C70}\x{9C71}\x{9C72}\x{9C73}\x{9C74}\x{9C75}\x{9C77}\x{9C78}' + . '\x{9C79}\x{9C7A}\x{9C7C}\x{9C7D}\x{9C7E}\x{9C7F}\x{9C80}\x{9C81}\x{9C82}' + . '\x{9C83}\x{9C84}\x{9C85}\x{9C86}\x{9C87}\x{9C88}\x{9C89}\x{9C8A}\x{9C8B}' + . '\x{9C8C}\x{9C8D}\x{9C8E}\x{9C8F}\x{9C90}\x{9C91}\x{9C92}\x{9C93}\x{9C94}' + . '\x{9C95}\x{9C96}\x{9C97}\x{9C98}\x{9C99}\x{9C9A}\x{9C9B}\x{9C9C}\x{9C9D}' + . '\x{9C9E}\x{9C9F}\x{9CA0}\x{9CA1}\x{9CA2}\x{9CA3}\x{9CA4}\x{9CA5}\x{9CA6}' + . '\x{9CA7}\x{9CA8}\x{9CA9}\x{9CAA}\x{9CAB}\x{9CAC}\x{9CAD}\x{9CAE}\x{9CAF}' + . '\x{9CB0}\x{9CB1}\x{9CB2}\x{9CB3}\x{9CB4}\x{9CB5}\x{9CB6}\x{9CB7}\x{9CB8}' + . '\x{9CB9}\x{9CBA}\x{9CBB}\x{9CBC}\x{9CBD}\x{9CBE}\x{9CBF}\x{9CC0}\x{9CC1}' + . '\x{9CC2}\x{9CC3}\x{9CC4}\x{9CC5}\x{9CC6}\x{9CC7}\x{9CC8}\x{9CC9}\x{9CCA}' + . '\x{9CCB}\x{9CCC}\x{9CCD}\x{9CCE}\x{9CCF}\x{9CD0}\x{9CD1}\x{9CD2}\x{9CD3}' + . '\x{9CD4}\x{9CD5}\x{9CD6}\x{9CD7}\x{9CD8}\x{9CD9}\x{9CDA}\x{9CDB}\x{9CDC}' + . '\x{9CDD}\x{9CDE}\x{9CDF}\x{9CE0}\x{9CE1}\x{9CE2}\x{9CE3}\x{9CE4}\x{9CE5}' + . '\x{9CE6}\x{9CE7}\x{9CE8}\x{9CE9}\x{9CEA}\x{9CEB}\x{9CEC}\x{9CED}\x{9CEE}' + . '\x{9CEF}\x{9CF0}\x{9CF1}\x{9CF2}\x{9CF3}\x{9CF4}\x{9CF5}\x{9CF6}\x{9CF7}' + . '\x{9CF8}\x{9CF9}\x{9CFA}\x{9CFB}\x{9CFC}\x{9CFD}\x{9CFE}\x{9CFF}\x{9D00}' + . '\x{9D01}\x{9D02}\x{9D03}\x{9D04}\x{9D05}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' + . '\x{9D0A}\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}\x{9D13}\x{9D14}\x{9D15}\x{9D16}' + . '\x{9D17}\x{9D18}\x{9D19}\x{9D1A}\x{9D1B}\x{9D1C}\x{9D1D}\x{9D1E}\x{9D1F}' + . '\x{9D20}\x{9D21}\x{9D22}\x{9D23}\x{9D24}\x{9D25}\x{9D26}\x{9D28}\x{9D29}' + . '\x{9D2B}\x{9D2D}\x{9D2E}\x{9D2F}\x{9D30}\x{9D31}\x{9D32}\x{9D33}\x{9D34}' + . '\x{9D36}\x{9D37}\x{9D38}\x{9D39}\x{9D3A}\x{9D3B}\x{9D3D}\x{9D3E}\x{9D3F}' + . '\x{9D40}\x{9D41}\x{9D42}\x{9D43}\x{9D45}\x{9D46}\x{9D47}\x{9D48}\x{9D49}' + . '\x{9D4A}\x{9D4B}\x{9D4C}\x{9D4D}\x{9D4E}\x{9D4F}\x{9D50}\x{9D51}\x{9D52}' + . '\x{9D53}\x{9D54}\x{9D55}\x{9D56}\x{9D57}\x{9D58}\x{9D59}\x{9D5A}\x{9D5B}' + . '\x{9D5C}\x{9D5D}\x{9D5E}\x{9D5F}\x{9D60}\x{9D61}\x{9D62}\x{9D63}\x{9D64}' + . '\x{9D65}\x{9D66}\x{9D67}\x{9D68}\x{9D69}\x{9D6A}\x{9D6B}\x{9D6C}\x{9D6E}' + . '\x{9D6F}\x{9D70}\x{9D71}\x{9D72}\x{9D73}\x{9D74}\x{9D75}\x{9D76}\x{9D77}' + . '\x{9D78}\x{9D79}\x{9D7A}\x{9D7B}\x{9D7C}\x{9D7D}\x{9D7E}\x{9D7F}\x{9D80}' + . '\x{9D81}\x{9D82}\x{9D83}\x{9D84}\x{9D85}\x{9D86}\x{9D87}\x{9D88}\x{9D89}' + . '\x{9D8A}\x{9D8B}\x{9D8C}\x{9D8D}\x{9D8E}\x{9D90}\x{9D91}\x{9D92}\x{9D93}' + . '\x{9D94}\x{9D96}\x{9D97}\x{9D98}\x{9D99}\x{9D9A}\x{9D9B}\x{9D9C}\x{9D9D}' + . '\x{9D9E}\x{9D9F}\x{9DA0}\x{9DA1}\x{9DA2}\x{9DA3}\x{9DA4}\x{9DA5}\x{9DA6}' + . '\x{9DA7}\x{9DA8}\x{9DA9}\x{9DAA}\x{9DAB}\x{9DAC}\x{9DAD}\x{9DAF}\x{9DB0}' + . '\x{9DB1}\x{9DB2}\x{9DB3}\x{9DB4}\x{9DB5}\x{9DB6}\x{9DB7}\x{9DB8}\x{9DB9}' + . '\x{9DBA}\x{9DBB}\x{9DBC}\x{9DBE}\x{9DBF}\x{9DC1}\x{9DC2}\x{9DC3}\x{9DC4}' + . '\x{9DC5}\x{9DC7}\x{9DC8}\x{9DC9}\x{9DCA}\x{9DCB}\x{9DCC}\x{9DCD}\x{9DCE}' + . '\x{9DCF}\x{9DD0}\x{9DD1}\x{9DD2}\x{9DD3}\x{9DD4}\x{9DD5}\x{9DD6}\x{9DD7}' + . '\x{9DD8}\x{9DD9}\x{9DDA}\x{9DDB}\x{9DDC}\x{9DDD}\x{9DDE}\x{9DDF}\x{9DE0}' + . '\x{9DE1}\x{9DE2}\x{9DE3}\x{9DE4}\x{9DE5}\x{9DE6}\x{9DE7}\x{9DE8}\x{9DE9}' + . '\x{9DEB}\x{9DEC}\x{9DED}\x{9DEE}\x{9DEF}\x{9DF0}\x{9DF1}\x{9DF2}\x{9DF3}' + . '\x{9DF4}\x{9DF5}\x{9DF6}\x{9DF7}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFB}\x{9DFD}' + . '\x{9DFE}\x{9DFF}\x{9E00}\x{9E01}\x{9E02}\x{9E03}\x{9E04}\x{9E05}\x{9E06}' + . '\x{9E07}\x{9E08}\x{9E09}\x{9E0A}\x{9E0B}\x{9E0C}\x{9E0D}\x{9E0F}\x{9E10}' + . '\x{9E11}\x{9E12}\x{9E13}\x{9E14}\x{9E15}\x{9E17}\x{9E18}\x{9E19}\x{9E1A}' + . '\x{9E1B}\x{9E1D}\x{9E1E}\x{9E1F}\x{9E20}\x{9E21}\x{9E22}\x{9E23}\x{9E24}' + . '\x{9E25}\x{9E26}\x{9E27}\x{9E28}\x{9E29}\x{9E2A}\x{9E2B}\x{9E2C}\x{9E2D}' + . '\x{9E2E}\x{9E2F}\x{9E30}\x{9E31}\x{9E32}\x{9E33}\x{9E34}\x{9E35}\x{9E36}' + . '\x{9E37}\x{9E38}\x{9E39}\x{9E3A}\x{9E3B}\x{9E3C}\x{9E3D}\x{9E3E}\x{9E3F}' + . '\x{9E40}\x{9E41}\x{9E42}\x{9E43}\x{9E44}\x{9E45}\x{9E46}\x{9E47}\x{9E48}' + . '\x{9E49}\x{9E4A}\x{9E4B}\x{9E4C}\x{9E4D}\x{9E4E}\x{9E4F}\x{9E50}\x{9E51}' + . '\x{9E52}\x{9E53}\x{9E54}\x{9E55}\x{9E56}\x{9E57}\x{9E58}\x{9E59}\x{9E5A}' + . '\x{9E5B}\x{9E5C}\x{9E5D}\x{9E5E}\x{9E5F}\x{9E60}\x{9E61}\x{9E62}\x{9E63}' + . '\x{9E64}\x{9E65}\x{9E66}\x{9E67}\x{9E68}\x{9E69}\x{9E6A}\x{9E6B}\x{9E6C}' + . '\x{9E6D}\x{9E6E}\x{9E6F}\x{9E70}\x{9E71}\x{9E72}\x{9E73}\x{9E74}\x{9E75}' + . '\x{9E76}\x{9E77}\x{9E79}\x{9E7A}\x{9E7C}\x{9E7D}\x{9E7E}\x{9E7F}\x{9E80}' + . '\x{9E81}\x{9E82}\x{9E83}\x{9E84}\x{9E85}\x{9E86}\x{9E87}\x{9E88}\x{9E89}' + . '\x{9E8A}\x{9E8B}\x{9E8C}\x{9E8D}\x{9E8E}\x{9E91}\x{9E92}\x{9E93}\x{9E94}' + . '\x{9E96}\x{9E97}\x{9E99}\x{9E9A}\x{9E9B}\x{9E9C}\x{9E9D}\x{9E9F}\x{9EA0}' + . '\x{9EA1}\x{9EA3}\x{9EA4}\x{9EA5}\x{9EA6}\x{9EA7}\x{9EA8}\x{9EA9}\x{9EAA}' + . '\x{9EAD}\x{9EAE}\x{9EAF}\x{9EB0}\x{9EB2}\x{9EB3}\x{9EB4}\x{9EB5}\x{9EB6}' + . '\x{9EB7}\x{9EB8}\x{9EBB}\x{9EBC}\x{9EBD}\x{9EBE}\x{9EBF}\x{9EC0}\x{9EC1}' + . '\x{9EC2}\x{9EC3}\x{9EC4}\x{9EC5}\x{9EC6}\x{9EC7}\x{9EC8}\x{9EC9}\x{9ECA}' + . '\x{9ECB}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED1}\x{9ED2}\x{9ED3}' + . '\x{9ED4}\x{9ED5}\x{9ED6}\x{9ED7}\x{9ED8}\x{9ED9}\x{9EDA}\x{9EDB}\x{9EDC}' + . '\x{9EDD}\x{9EDE}\x{9EDF}\x{9EE0}\x{9EE1}\x{9EE2}\x{9EE3}\x{9EE4}\x{9EE5}' + . '\x{9EE6}\x{9EE7}\x{9EE8}\x{9EE9}\x{9EEA}\x{9EEB}\x{9EED}\x{9EEE}\x{9EEF}' + . '\x{9EF0}\x{9EF2}\x{9EF3}\x{9EF4}\x{9EF5}\x{9EF6}\x{9EF7}\x{9EF8}\x{9EF9}' + . '\x{9EFA}\x{9EFB}\x{9EFC}\x{9EFD}\x{9EFE}\x{9EFF}\x{9F00}\x{9F01}\x{9F02}' + . '\x{9F04}\x{9F05}\x{9F06}\x{9F07}\x{9F08}\x{9F09}\x{9F0A}\x{9F0B}\x{9F0C}' + . '\x{9F0D}\x{9F0E}\x{9F0F}\x{9F10}\x{9F12}\x{9F13}\x{9F15}\x{9F16}\x{9F17}' + . '\x{9F18}\x{9F19}\x{9F1A}\x{9F1B}\x{9F1C}\x{9F1D}\x{9F1E}\x{9F1F}\x{9F20}' + . '\x{9F22}\x{9F23}\x{9F24}\x{9F25}\x{9F27}\x{9F28}\x{9F29}\x{9F2A}\x{9F2B}' + . '\x{9F2C}\x{9F2D}\x{9F2E}\x{9F2F}\x{9F30}\x{9F31}\x{9F32}\x{9F33}\x{9F34}' + . '\x{9F35}\x{9F36}\x{9F37}\x{9F38}\x{9F39}\x{9F3A}\x{9F3B}\x{9F3C}\x{9F3D}' + . '\x{9F3E}\x{9F3F}\x{9F40}\x{9F41}\x{9F42}\x{9F43}\x{9F44}\x{9F46}\x{9F47}' + . '\x{9F48}\x{9F49}\x{9F4A}\x{9F4B}\x{9F4C}\x{9F4D}\x{9F4E}\x{9F4F}\x{9F50}' + . '\x{9F51}\x{9F52}\x{9F54}\x{9F55}\x{9F56}\x{9F57}\x{9F58}\x{9F59}\x{9F5A}' + . '\x{9F5B}\x{9F5C}\x{9F5D}\x{9F5E}\x{9F5F}\x{9F60}\x{9F61}\x{9F63}\x{9F64}' + . '\x{9F65}\x{9F66}\x{9F67}\x{9F68}\x{9F69}\x{9F6A}\x{9F6B}\x{9F6C}\x{9F6E}' + . '\x{9F6F}\x{9F70}\x{9F71}\x{9F72}\x{9F73}\x{9F74}\x{9F75}\x{9F76}\x{9F77}' + . '\x{9F78}\x{9F79}\x{9F7A}\x{9F7B}\x{9F7C}\x{9F7D}\x{9F7E}\x{9F7F}\x{9F80}' + . '\x{9F81}\x{9F82}\x{9F83}\x{9F84}\x{9F85}\x{9F86}\x{9F87}\x{9F88}\x{9F89}' + . '\x{9F8A}\x{9F8B}\x{9F8C}\x{9F8D}\x{9F8E}\x{9F8F}\x{9F90}\x{9F91}\x{9F92}' + . '\x{9F93}\x{9F94}\x{9F95}\x{9F96}\x{9F97}\x{9F98}\x{9F99}\x{9F9A}\x{9F9B}' + . '\x{9F9C}\x{9F9D}\x{9F9E}\x{9F9F}\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu', +]; diff --git a/vendor/laminas/laminas-validator/src/Hostname/Cn.php b/vendor/laminas/laminas-validator/src/Hostname/Cn.php new file mode 100644 index 00000000..d280764b --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Hostname/Cn.php @@ -0,0 +1,2179 @@ + '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' + . '\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}' + . '\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}' + . '\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}' + . '\x{49B6}\x{49B7}\x{4C77}\x{4C9F}\x{4CA0}\x{4CA1}\x{4CA2}\x{4CA3}\x{4D13}' + . '\x{4D14}\x{4D15}\x{4D16}\x{4D17}\x{4D18}\x{4D19}\x{4DAE}\x{4E00}\x{4E01}' + . '\x{4E02}\x{4E03}\x{4E04}\x{4E05}\x{4E06}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' + . '\x{4E0B}\x{4E0C}\x{4E0D}\x{4E0E}\x{4E0F}\x{4E10}\x{4E11}\x{4E13}\x{4E14}' + . '\x{4E15}\x{4E16}\x{4E17}\x{4E18}\x{4E19}\x{4E1A}\x{4E1B}\x{4E1C}\x{4E1D}' + . '\x{4E1E}\x{4E1F}\x{4E20}\x{4E21}\x{4E22}\x{4E23}\x{4E24}\x{4E25}\x{4E26}' + . '\x{4E27}\x{4E28}\x{4E2A}\x{4E2B}\x{4E2C}\x{4E2D}\x{4E2E}\x{4E2F}\x{4E30}' + . '\x{4E31}\x{4E32}\x{4E33}\x{4E34}\x{4E35}\x{4E36}\x{4E37}\x{4E38}\x{4E39}' + . '\x{4E3A}\x{4E3B}\x{4E3C}\x{4E3D}\x{4E3E}\x{4E3F}\x{4E40}\x{4E41}\x{4E42}' + . '\x{4E43}\x{4E44}\x{4E45}\x{4E46}\x{4E47}\x{4E48}\x{4E49}\x{4E4A}\x{4E4B}' + . '\x{4E4C}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E50}\x{4E51}\x{4E52}\x{4E53}\x{4E54}' + . '\x{4E56}\x{4E57}\x{4E58}\x{4E59}\x{4E5A}\x{4E5B}\x{4E5C}\x{4E5D}\x{4E5E}' + . '\x{4E5F}\x{4E60}\x{4E61}\x{4E62}\x{4E63}\x{4E64}\x{4E65}\x{4E66}\x{4E67}' + . '\x{4E69}\x{4E6A}\x{4E6B}\x{4E6C}\x{4E6D}\x{4E6E}\x{4E6F}\x{4E70}\x{4E71}' + . '\x{4E72}\x{4E73}\x{4E74}\x{4E75}\x{4E76}\x{4E77}\x{4E78}\x{4E7A}\x{4E7B}' + . '\x{4E7C}\x{4E7D}\x{4E7E}\x{4E7F}\x{4E80}\x{4E81}\x{4E82}\x{4E83}\x{4E84}' + . '\x{4E85}\x{4E86}\x{4E87}\x{4E88}\x{4E89}\x{4E8B}\x{4E8C}\x{4E8D}\x{4E8E}' + . '\x{4E8F}\x{4E90}\x{4E91}\x{4E92}\x{4E93}\x{4E94}\x{4E95}\x{4E97}\x{4E98}' + . '\x{4E99}\x{4E9A}\x{4E9B}\x{4E9C}\x{4E9D}\x{4E9E}\x{4E9F}\x{4EA0}\x{4EA1}' + . '\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA7}\x{4EA8}\x{4EA9}\x{4EAA}\x{4EAB}' + . '\x{4EAC}\x{4EAD}\x{4EAE}\x{4EAF}\x{4EB0}\x{4EB1}\x{4EB2}\x{4EB3}\x{4EB4}' + . '\x{4EB5}\x{4EB6}\x{4EB7}\x{4EB8}\x{4EB9}\x{4EBA}\x{4EBB}\x{4EBD}\x{4EBE}' + . '\x{4EBF}\x{4EC0}\x{4EC1}\x{4EC2}\x{4EC3}\x{4EC4}\x{4EC5}\x{4EC6}\x{4EC7}' + . '\x{4EC8}\x{4EC9}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED0}\x{4ED1}' + . '\x{4ED2}\x{4ED3}\x{4ED4}\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDA}' + . '\x{4EDB}\x{4EDC}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE0}\x{4EE1}\x{4EE2}\x{4EE3}' + . '\x{4EE4}\x{4EE5}\x{4EE6}\x{4EE8}\x{4EE9}\x{4EEA}\x{4EEB}\x{4EEC}\x{4EEF}' + . '\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EFB}' + . '\x{4EFD}\x{4EFF}\x{4F00}\x{4F01}\x{4F02}\x{4F03}\x{4F04}\x{4F05}\x{4F06}' + . '\x{4F08}\x{4F09}\x{4F0A}\x{4F0B}\x{4F0C}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}' + . '\x{4F11}\x{4F12}\x{4F13}\x{4F14}\x{4F15}\x{4F17}\x{4F18}\x{4F19}\x{4F1A}' + . '\x{4F1B}\x{4F1C}\x{4F1D}\x{4F1E}\x{4F1F}\x{4F20}\x{4F21}\x{4F22}\x{4F23}' + . '\x{4F24}\x{4F25}\x{4F26}\x{4F27}\x{4F29}\x{4F2A}\x{4F2B}\x{4F2C}\x{4F2D}' + . '\x{4F2E}\x{4F2F}\x{4F30}\x{4F32}\x{4F33}\x{4F34}\x{4F36}\x{4F38}\x{4F39}' + . '\x{4F3A}\x{4F3B}\x{4F3C}\x{4F3D}\x{4F3E}\x{4F3F}\x{4F41}\x{4F42}\x{4F43}' + . '\x{4F45}\x{4F46}\x{4F47}\x{4F48}\x{4F49}\x{4F4A}\x{4F4B}\x{4F4C}\x{4F4D}' + . '\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}\x{4F52}\x{4F53}\x{4F54}\x{4F55}\x{4F56}' + . '\x{4F57}\x{4F58}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}\x{4F5F}' + . '\x{4F60}\x{4F61}\x{4F62}\x{4F63}\x{4F64}\x{4F65}\x{4F66}\x{4F67}\x{4F68}' + . '\x{4F69}\x{4F6A}\x{4F6B}\x{4F6C}\x{4F6D}\x{4F6E}\x{4F6F}\x{4F70}\x{4F72}' + . '\x{4F73}\x{4F74}\x{4F75}\x{4F76}\x{4F77}\x{4F78}\x{4F79}\x{4F7A}\x{4F7B}' + . '\x{4F7C}\x{4F7D}\x{4F7E}\x{4F7F}\x{4F80}\x{4F81}\x{4F82}\x{4F83}\x{4F84}' + . '\x{4F85}\x{4F86}\x{4F87}\x{4F88}\x{4F89}\x{4F8A}\x{4F8B}\x{4F8D}\x{4F8F}' + . '\x{4F90}\x{4F91}\x{4F92}\x{4F93}\x{4F94}\x{4F95}\x{4F96}\x{4F97}\x{4F98}' + . '\x{4F99}\x{4F9A}\x{4F9B}\x{4F9C}\x{4F9D}\x{4F9E}\x{4F9F}\x{4FA0}\x{4FA1}' + . '\x{4FA3}\x{4FA4}\x{4FA5}\x{4FA6}\x{4FA7}\x{4FA8}\x{4FA9}\x{4FAA}\x{4FAB}' + . '\x{4FAC}\x{4FAE}\x{4FAF}\x{4FB0}\x{4FB1}\x{4FB2}\x{4FB3}\x{4FB4}\x{4FB5}' + . '\x{4FB6}\x{4FB7}\x{4FB8}\x{4FB9}\x{4FBA}\x{4FBB}\x{4FBC}\x{4FBE}\x{4FBF}' + . '\x{4FC0}\x{4FC1}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FC5}\x{4FC7}\x{4FC9}\x{4FCA}' + . '\x{4FCB}\x{4FCD}\x{4FCE}\x{4FCF}\x{4FD0}\x{4FD1}\x{4FD2}\x{4FD3}\x{4FD4}' + . '\x{4FD5}\x{4FD6}\x{4FD7}\x{4FD8}\x{4FD9}\x{4FDA}\x{4FDB}\x{4FDC}\x{4FDD}' + . '\x{4FDE}\x{4FDF}\x{4FE0}\x{4FE1}\x{4FE3}\x{4FE4}\x{4FE5}\x{4FE6}\x{4FE7}' + . '\x{4FE8}\x{4FE9}\x{4FEA}\x{4FEB}\x{4FEC}\x{4FED}\x{4FEE}\x{4FEF}\x{4FF0}' + . '\x{4FF1}\x{4FF2}\x{4FF3}\x{4FF4}\x{4FF5}\x{4FF6}\x{4FF7}\x{4FF8}\x{4FF9}' + . '\x{4FFA}\x{4FFB}\x{4FFE}\x{4FFF}\x{5000}\x{5001}\x{5002}\x{5003}\x{5004}' + . '\x{5005}\x{5006}\x{5007}\x{5008}\x{5009}\x{500A}\x{500B}\x{500C}\x{500D}' + . '\x{500E}\x{500F}\x{5011}\x{5012}\x{5013}\x{5014}\x{5015}\x{5016}\x{5017}' + . '\x{5018}\x{5019}\x{501A}\x{501B}\x{501C}\x{501D}\x{501E}\x{501F}\x{5020}' + . '\x{5021}\x{5022}\x{5023}\x{5024}\x{5025}\x{5026}\x{5027}\x{5028}\x{5029}' + . '\x{502A}\x{502B}\x{502C}\x{502D}\x{502E}\x{502F}\x{5030}\x{5031}\x{5032}' + . '\x{5033}\x{5035}\x{5036}\x{5037}\x{5039}\x{503A}\x{503B}\x{503C}\x{503E}' + . '\x{503F}\x{5040}\x{5041}\x{5043}\x{5044}\x{5045}\x{5046}\x{5047}\x{5048}' + . '\x{5049}\x{504A}\x{504B}\x{504C}\x{504D}\x{504E}\x{504F}\x{5051}\x{5053}' + . '\x{5054}\x{5055}\x{5056}\x{5057}\x{5059}\x{505A}\x{505B}\x{505C}\x{505D}' + . '\x{505E}\x{505F}\x{5060}\x{5061}\x{5062}\x{5063}\x{5064}\x{5065}\x{5066}' + . '\x{5067}\x{5068}\x{5069}\x{506A}\x{506B}\x{506C}\x{506D}\x{506E}\x{506F}' + . '\x{5070}\x{5071}\x{5072}\x{5073}\x{5074}\x{5075}\x{5076}\x{5077}\x{5078}' + . '\x{5079}\x{507A}\x{507B}\x{507D}\x{507E}\x{507F}\x{5080}\x{5082}\x{5083}' + . '\x{5084}\x{5085}\x{5086}\x{5087}\x{5088}\x{5089}\x{508A}\x{508B}\x{508C}' + . '\x{508D}\x{508E}\x{508F}\x{5090}\x{5091}\x{5092}\x{5094}\x{5095}\x{5096}' + . '\x{5098}\x{5099}\x{509A}\x{509B}\x{509C}\x{509D}\x{509E}\x{50A2}\x{50A3}' + . '\x{50A4}\x{50A5}\x{50A6}\x{50A7}\x{50A8}\x{50A9}\x{50AA}\x{50AB}\x{50AC}' + . '\x{50AD}\x{50AE}\x{50AF}\x{50B0}\x{50B1}\x{50B2}\x{50B3}\x{50B4}\x{50B5}' + . '\x{50B6}\x{50B7}\x{50B8}\x{50BA}\x{50BB}\x{50BC}\x{50BD}\x{50BE}\x{50BF}' + . '\x{50C0}\x{50C1}\x{50C2}\x{50C4}\x{50C5}\x{50C6}\x{50C7}\x{50C8}\x{50C9}' + . '\x{50CA}\x{50CB}\x{50CC}\x{50CD}\x{50CE}\x{50CF}\x{50D0}\x{50D1}\x{50D2}' + . '\x{50D3}\x{50D4}\x{50D5}\x{50D6}\x{50D7}\x{50D9}\x{50DA}\x{50DB}\x{50DC}' + . '\x{50DD}\x{50DE}\x{50E0}\x{50E3}\x{50E4}\x{50E5}\x{50E6}\x{50E7}\x{50E8}' + . '\x{50E9}\x{50EA}\x{50EC}\x{50ED}\x{50EE}\x{50EF}\x{50F0}\x{50F1}\x{50F2}' + . '\x{50F3}\x{50F5}\x{50F6}\x{50F8}\x{50F9}\x{50FA}\x{50FB}\x{50FC}\x{50FD}' + . '\x{50FE}\x{50FF}\x{5100}\x{5101}\x{5102}\x{5103}\x{5104}\x{5105}\x{5106}' + . '\x{5107}\x{5108}\x{5109}\x{510A}\x{510B}\x{510C}\x{510D}\x{510E}\x{510F}' + . '\x{5110}\x{5111}\x{5112}\x{5113}\x{5114}\x{5115}\x{5116}\x{5117}\x{5118}' + . '\x{5119}\x{511A}\x{511C}\x{511D}\x{511E}\x{511F}\x{5120}\x{5121}\x{5122}' + . '\x{5123}\x{5124}\x{5125}\x{5126}\x{5127}\x{5129}\x{512A}\x{512C}\x{512D}' + . '\x{512E}\x{512F}\x{5130}\x{5131}\x{5132}\x{5133}\x{5134}\x{5135}\x{5136}' + . '\x{5137}\x{5138}\x{5139}\x{513A}\x{513B}\x{513C}\x{513D}\x{513E}\x{513F}' + . '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' + . '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5151}\x{5152}\x{5154}\x{5155}' + . '\x{5156}\x{5157}\x{5159}\x{515A}\x{515B}\x{515C}\x{515D}\x{515E}\x{515F}' + . '\x{5161}\x{5162}\x{5163}\x{5165}\x{5166}\x{5167}\x{5168}\x{5169}\x{516A}' + . '\x{516B}\x{516C}\x{516D}\x{516E}\x{516F}\x{5170}\x{5171}\x{5173}\x{5174}' + . '\x{5175}\x{5176}\x{5177}\x{5178}\x{5179}\x{517A}\x{517B}\x{517C}\x{517D}' + . '\x{517F}\x{5180}\x{5181}\x{5182}\x{5185}\x{5186}\x{5187}\x{5188}\x{5189}' + . '\x{518A}\x{518B}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}\x{5193}' + . '\x{5194}\x{5195}\x{5196}\x{5197}\x{5198}\x{5199}\x{519A}\x{519B}\x{519C}' + . '\x{519D}\x{519E}\x{519F}\x{51A0}\x{51A2}\x{51A4}\x{51A5}\x{51A6}\x{51A7}' + . '\x{51A8}\x{51AA}\x{51AB}\x{51AC}\x{51AE}\x{51AF}\x{51B0}\x{51B1}\x{51B2}' + . '\x{51B3}\x{51B5}\x{51B6}\x{51B7}\x{51B9}\x{51BB}\x{51BC}\x{51BD}\x{51BE}' + . '\x{51BF}\x{51C0}\x{51C1}\x{51C3}\x{51C4}\x{51C5}\x{51C6}\x{51C7}\x{51C8}' + . '\x{51C9}\x{51CA}\x{51CB}\x{51CC}\x{51CD}\x{51CE}\x{51CF}\x{51D0}\x{51D1}' + . '\x{51D4}\x{51D5}\x{51D6}\x{51D7}\x{51D8}\x{51D9}\x{51DA}\x{51DB}\x{51DC}' + . '\x{51DD}\x{51DE}\x{51E0}\x{51E1}\x{51E2}\x{51E3}\x{51E4}\x{51E5}\x{51E7}' + . '\x{51E8}\x{51E9}\x{51EA}\x{51EB}\x{51ED}\x{51EF}\x{51F0}\x{51F1}\x{51F3}' + . '\x{51F4}\x{51F5}\x{51F6}\x{51F7}\x{51F8}\x{51F9}\x{51FA}\x{51FB}\x{51FC}' + . '\x{51FD}\x{51FE}\x{51FF}\x{5200}\x{5201}\x{5202}\x{5203}\x{5204}\x{5205}' + . '\x{5206}\x{5207}\x{5208}\x{5209}\x{520A}\x{520B}\x{520C}\x{520D}\x{520E}' + . '\x{520F}\x{5210}\x{5211}\x{5212}\x{5213}\x{5214}\x{5215}\x{5216}\x{5217}' + . '\x{5218}\x{5219}\x{521A}\x{521B}\x{521C}\x{521D}\x{521E}\x{521F}\x{5220}' + . '\x{5221}\x{5222}\x{5223}\x{5224}\x{5225}\x{5226}\x{5228}\x{5229}\x{522A}' + . '\x{522B}\x{522C}\x{522D}\x{522E}\x{522F}\x{5230}\x{5231}\x{5232}\x{5233}' + . '\x{5234}\x{5235}\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{523C}' + . '\x{523D}\x{523E}\x{523F}\x{5240}\x{5241}\x{5242}\x{5243}\x{5244}\x{5245}' + . '\x{5246}\x{5247}\x{5248}\x{5249}\x{524A}\x{524B}\x{524C}\x{524D}\x{524E}' + . '\x{5250}\x{5251}\x{5252}\x{5254}\x{5255}\x{5256}\x{5257}\x{5258}\x{5259}' + . '\x{525A}\x{525B}\x{525C}\x{525D}\x{525E}\x{525F}\x{5260}\x{5261}\x{5262}' + . '\x{5263}\x{5264}\x{5265}\x{5267}\x{5268}\x{5269}\x{526A}\x{526B}\x{526C}' + . '\x{526D}\x{526E}\x{526F}\x{5270}\x{5272}\x{5273}\x{5274}\x{5275}\x{5276}' + . '\x{5277}\x{5278}\x{527A}\x{527B}\x{527C}\x{527D}\x{527E}\x{527F}\x{5280}' + . '\x{5281}\x{5282}\x{5283}\x{5284}\x{5286}\x{5287}\x{5288}\x{5289}\x{528A}' + . '\x{528B}\x{528C}\x{528D}\x{528F}\x{5290}\x{5291}\x{5292}\x{5293}\x{5294}' + . '\x{5295}\x{5296}\x{5297}\x{5298}\x{5299}\x{529A}\x{529B}\x{529C}\x{529D}' + . '\x{529E}\x{529F}\x{52A0}\x{52A1}\x{52A2}\x{52A3}\x{52A5}\x{52A6}\x{52A7}' + . '\x{52A8}\x{52A9}\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52AE}\x{52AF}\x{52B0}' + . '\x{52B1}\x{52B2}\x{52B3}\x{52B4}\x{52B5}\x{52B6}\x{52B7}\x{52B8}\x{52B9}' + . '\x{52BA}\x{52BB}\x{52BC}\x{52BD}\x{52BE}\x{52BF}\x{52C0}\x{52C1}\x{52C2}' + . '\x{52C3}\x{52C6}\x{52C7}\x{52C9}\x{52CA}\x{52CB}\x{52CD}\x{52CF}\x{52D0}' + . '\x{52D2}\x{52D3}\x{52D5}\x{52D6}\x{52D7}\x{52D8}\x{52D9}\x{52DA}\x{52DB}' + . '\x{52DC}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}\x{52E4}\x{52E6}' + . '\x{52E7}\x{52E8}\x{52E9}\x{52EA}\x{52EB}\x{52EC}\x{52ED}\x{52EF}\x{52F0}' + . '\x{52F1}\x{52F2}\x{52F3}\x{52F4}\x{52F5}\x{52F6}\x{52F7}\x{52F8}\x{52F9}' + . '\x{52FA}\x{52FB}\x{52FC}\x{52FD}\x{52FE}\x{52FF}\x{5300}\x{5301}\x{5302}' + . '\x{5305}\x{5306}\x{5307}\x{5308}\x{5309}\x{530A}\x{530B}\x{530C}\x{530D}' + . '\x{530E}\x{530F}\x{5310}\x{5311}\x{5312}\x{5313}\x{5314}\x{5315}\x{5316}' + . '\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}\x{5320}\x{5321}\x{5322}' + . '\x{5323}\x{5324}\x{5325}\x{5326}\x{5328}\x{532A}\x{532B}\x{532C}\x{532D}' + . '\x{532E}\x{532F}\x{5330}\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}\x{533A}' + . '\x{533B}\x{533C}\x{533D}\x{533E}\x{533F}\x{5340}\x{5341}\x{5343}\x{5344}' + . '\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}\x{534A}\x{534B}\x{534C}\x{534D}' + . '\x{534E}\x{534F}\x{5350}\x{5351}\x{5352}\x{5353}\x{5354}\x{5355}\x{5356}' + . '\x{5357}\x{5358}\x{5359}\x{535A}\x{535C}\x{535E}\x{535F}\x{5360}\x{5361}' + . '\x{5362}\x{5363}\x{5364}\x{5365}\x{5366}\x{5367}\x{5369}\x{536B}\x{536C}' + . '\x{536E}\x{536F}\x{5370}\x{5371}\x{5372}\x{5373}\x{5374}\x{5375}\x{5376}' + . '\x{5377}\x{5378}\x{5379}\x{537A}\x{537B}\x{537C}\x{537D}\x{537E}\x{537F}' + . '\x{5381}\x{5382}\x{5383}\x{5384}\x{5385}\x{5386}\x{5387}\x{5388}\x{5389}' + . '\x{538A}\x{538B}\x{538C}\x{538D}\x{538E}\x{538F}\x{5390}\x{5391}\x{5392}' + . '\x{5393}\x{5394}\x{5395}\x{5396}\x{5397}\x{5398}\x{5399}\x{539A}\x{539B}' + . '\x{539C}\x{539D}\x{539E}\x{539F}\x{53A0}\x{53A2}\x{53A3}\x{53A4}\x{53A5}' + . '\x{53A6}\x{53A7}\x{53A8}\x{53A9}\x{53AC}\x{53AD}\x{53AE}\x{53B0}\x{53B1}' + . '\x{53B2}\x{53B3}\x{53B4}\x{53B5}\x{53B6}\x{53B7}\x{53B8}\x{53B9}\x{53BB}' + . '\x{53BC}\x{53BD}\x{53BE}\x{53BF}\x{53C0}\x{53C1}\x{53C2}\x{53C3}\x{53C4}' + . '\x{53C6}\x{53C7}\x{53C8}\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}' + . '\x{53D0}\x{53D1}\x{53D2}\x{53D3}\x{53D4}\x{53D5}\x{53D6}\x{53D7}\x{53D8}' + . '\x{53D9}\x{53DB}\x{53DC}\x{53DF}\x{53E0}\x{53E1}\x{53E2}\x{53E3}\x{53E4}' + . '\x{53E5}\x{53E6}\x{53E8}\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}' + . '\x{53EF}\x{53F0}\x{53F1}\x{53F2}\x{53F3}\x{53F4}\x{53F5}\x{53F6}\x{53F7}' + . '\x{53F8}\x{53F9}\x{53FA}\x{53FB}\x{53FC}\x{53FD}\x{53FE}\x{5401}\x{5402}' + . '\x{5403}\x{5404}\x{5405}\x{5406}\x{5407}\x{5408}\x{5409}\x{540A}\x{540B}' + . '\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}\x{5411}\x{5412}\x{5413}\x{5414}' + . '\x{5415}\x{5416}\x{5417}\x{5418}\x{5419}\x{541B}\x{541C}\x{541D}\x{541E}' + . '\x{541F}\x{5420}\x{5421}\x{5423}\x{5424}\x{5425}\x{5426}\x{5427}\x{5428}' + . '\x{5429}\x{542A}\x{542B}\x{542C}\x{542D}\x{542E}\x{542F}\x{5430}\x{5431}' + . '\x{5432}\x{5433}\x{5434}\x{5435}\x{5436}\x{5437}\x{5438}\x{5439}\x{543A}' + . '\x{543B}\x{543C}\x{543D}\x{543E}\x{543F}\x{5440}\x{5441}\x{5442}\x{5443}' + . '\x{5444}\x{5445}\x{5446}\x{5447}\x{5448}\x{5449}\x{544A}\x{544B}\x{544D}' + . '\x{544E}\x{544F}\x{5450}\x{5451}\x{5452}\x{5453}\x{5454}\x{5455}\x{5456}' + . '\x{5457}\x{5458}\x{5459}\x{545A}\x{545B}\x{545C}\x{545E}\x{545F}\x{5460}' + . '\x{5461}\x{5462}\x{5463}\x{5464}\x{5465}\x{5466}\x{5467}\x{5468}\x{546A}' + . '\x{546B}\x{546C}\x{546D}\x{546E}\x{546F}\x{5470}\x{5471}\x{5472}\x{5473}' + . '\x{5474}\x{5475}\x{5476}\x{5477}\x{5478}\x{5479}\x{547A}\x{547B}\x{547C}' + . '\x{547D}\x{547E}\x{547F}\x{5480}\x{5481}\x{5482}\x{5483}\x{5484}\x{5485}' + . '\x{5486}\x{5487}\x{5488}\x{5489}\x{548B}\x{548C}\x{548D}\x{548E}\x{548F}' + . '\x{5490}\x{5491}\x{5492}\x{5493}\x{5494}\x{5495}\x{5496}\x{5497}\x{5498}' + . '\x{5499}\x{549A}\x{549B}\x{549C}\x{549D}\x{549E}\x{549F}\x{54A0}\x{54A1}' + . '\x{54A2}\x{54A3}\x{54A4}\x{54A5}\x{54A6}\x{54A7}\x{54A8}\x{54A9}\x{54AA}' + . '\x{54AB}\x{54AC}\x{54AD}\x{54AE}\x{54AF}\x{54B0}\x{54B1}\x{54B2}\x{54B3}' + . '\x{54B4}\x{54B6}\x{54B7}\x{54B8}\x{54B9}\x{54BA}\x{54BB}\x{54BC}\x{54BD}' + . '\x{54BE}\x{54BF}\x{54C0}\x{54C1}\x{54C2}\x{54C3}\x{54C4}\x{54C5}\x{54C6}' + . '\x{54C7}\x{54C8}\x{54C9}\x{54CA}\x{54CB}\x{54CC}\x{54CD}\x{54CE}\x{54CF}' + . '\x{54D0}\x{54D1}\x{54D2}\x{54D3}\x{54D4}\x{54D5}\x{54D6}\x{54D7}\x{54D8}' + . '\x{54D9}\x{54DA}\x{54DB}\x{54DC}\x{54DD}\x{54DE}\x{54DF}\x{54E0}\x{54E1}' + . '\x{54E2}\x{54E3}\x{54E4}\x{54E5}\x{54E6}\x{54E7}\x{54E8}\x{54E9}\x{54EA}' + . '\x{54EB}\x{54EC}\x{54ED}\x{54EE}\x{54EF}\x{54F0}\x{54F1}\x{54F2}\x{54F3}' + . '\x{54F4}\x{54F5}\x{54F7}\x{54F8}\x{54F9}\x{54FA}\x{54FB}\x{54FC}\x{54FD}' + . '\x{54FE}\x{54FF}\x{5500}\x{5501}\x{5502}\x{5503}\x{5504}\x{5505}\x{5506}' + . '\x{5507}\x{5508}\x{5509}\x{550A}\x{550B}\x{550C}\x{550D}\x{550E}\x{550F}' + . '\x{5510}\x{5511}\x{5512}\x{5513}\x{5514}\x{5516}\x{5517}\x{551A}\x{551B}' + . '\x{551C}\x{551D}\x{551E}\x{551F}\x{5520}\x{5521}\x{5522}\x{5523}\x{5524}' + . '\x{5525}\x{5526}\x{5527}\x{5528}\x{5529}\x{552A}\x{552B}\x{552C}\x{552D}' + . '\x{552E}\x{552F}\x{5530}\x{5531}\x{5532}\x{5533}\x{5534}\x{5535}\x{5536}' + . '\x{5537}\x{5538}\x{5539}\x{553A}\x{553B}\x{553C}\x{553D}\x{553E}\x{553F}' + . '\x{5540}\x{5541}\x{5542}\x{5543}\x{5544}\x{5545}\x{5546}\x{5548}\x{5549}' + . '\x{554A}\x{554B}\x{554C}\x{554D}\x{554E}\x{554F}\x{5550}\x{5551}\x{5552}' + . '\x{5553}\x{5554}\x{5555}\x{5556}\x{5557}\x{5558}\x{5559}\x{555A}\x{555B}' + . '\x{555C}\x{555D}\x{555E}\x{555F}\x{5561}\x{5562}\x{5563}\x{5564}\x{5565}' + . '\x{5566}\x{5567}\x{5568}\x{5569}\x{556A}\x{556B}\x{556C}\x{556D}\x{556E}' + . '\x{556F}\x{5570}\x{5571}\x{5572}\x{5573}\x{5574}\x{5575}\x{5576}\x{5577}' + . '\x{5578}\x{5579}\x{557B}\x{557C}\x{557D}\x{557E}\x{557F}\x{5580}\x{5581}' + . '\x{5582}\x{5583}\x{5584}\x{5585}\x{5586}\x{5587}\x{5588}\x{5589}\x{558A}' + . '\x{558B}\x{558C}\x{558D}\x{558E}\x{558F}\x{5590}\x{5591}\x{5592}\x{5593}' + . '\x{5594}\x{5595}\x{5596}\x{5597}\x{5598}\x{5599}\x{559A}\x{559B}\x{559C}' + . '\x{559D}\x{559E}\x{559F}\x{55A0}\x{55A1}\x{55A2}\x{55A3}\x{55A4}\x{55A5}' + . '\x{55A6}\x{55A7}\x{55A8}\x{55A9}\x{55AA}\x{55AB}\x{55AC}\x{55AD}\x{55AE}' + . '\x{55AF}\x{55B0}\x{55B1}\x{55B2}\x{55B3}\x{55B4}\x{55B5}\x{55B6}\x{55B7}' + . '\x{55B8}\x{55B9}\x{55BA}\x{55BB}\x{55BC}\x{55BD}\x{55BE}\x{55BF}\x{55C0}' + . '\x{55C1}\x{55C2}\x{55C3}\x{55C4}\x{55C5}\x{55C6}\x{55C7}\x{55C8}\x{55C9}' + . '\x{55CA}\x{55CB}\x{55CC}\x{55CD}\x{55CE}\x{55CF}\x{55D0}\x{55D1}\x{55D2}' + . '\x{55D3}\x{55D4}\x{55D5}\x{55D6}\x{55D7}\x{55D8}\x{55D9}\x{55DA}\x{55DB}' + . '\x{55DC}\x{55DD}\x{55DE}\x{55DF}\x{55E1}\x{55E2}\x{55E3}\x{55E4}\x{55E5}' + . '\x{55E6}\x{55E7}\x{55E8}\x{55E9}\x{55EA}\x{55EB}\x{55EC}\x{55ED}\x{55EE}' + . '\x{55EF}\x{55F0}\x{55F1}\x{55F2}\x{55F3}\x{55F4}\x{55F5}\x{55F6}\x{55F7}' + . '\x{55F9}\x{55FA}\x{55FB}\x{55FC}\x{55FD}\x{55FE}\x{55FF}\x{5600}\x{5601}' + . '\x{5602}\x{5603}\x{5604}\x{5606}\x{5607}\x{5608}\x{5609}\x{560C}\x{560D}' + . '\x{560E}\x{560F}\x{5610}\x{5611}\x{5612}\x{5613}\x{5614}\x{5615}\x{5616}' + . '\x{5617}\x{5618}\x{5619}\x{561A}\x{561B}\x{561C}\x{561D}\x{561E}\x{561F}' + . '\x{5621}\x{5622}\x{5623}\x{5624}\x{5625}\x{5626}\x{5627}\x{5628}\x{5629}' + . '\x{562A}\x{562C}\x{562D}\x{562E}\x{562F}\x{5630}\x{5631}\x{5632}\x{5633}' + . '\x{5634}\x{5635}\x{5636}\x{5638}\x{5639}\x{563A}\x{563B}\x{563D}\x{563E}' + . '\x{563F}\x{5640}\x{5641}\x{5642}\x{5643}\x{5645}\x{5646}\x{5647}\x{5648}' + . '\x{5649}\x{564A}\x{564C}\x{564D}\x{564E}\x{564F}\x{5650}\x{5652}\x{5653}' + . '\x{5654}\x{5655}\x{5657}\x{5658}\x{5659}\x{565A}\x{565B}\x{565C}\x{565D}' + . '\x{565E}\x{5660}\x{5662}\x{5663}\x{5664}\x{5665}\x{5666}\x{5667}\x{5668}' + . '\x{5669}\x{566A}\x{566B}\x{566C}\x{566D}\x{566E}\x{566F}\x{5670}\x{5671}' + . '\x{5672}\x{5673}\x{5674}\x{5676}\x{5677}\x{5678}\x{5679}\x{567A}\x{567B}' + . '\x{567C}\x{567E}\x{567F}\x{5680}\x{5681}\x{5682}\x{5683}\x{5684}\x{5685}' + . '\x{5686}\x{5687}\x{568A}\x{568C}\x{568D}\x{568E}\x{568F}\x{5690}\x{5691}' + . '\x{5692}\x{5693}\x{5694}\x{5695}\x{5697}\x{5698}\x{5699}\x{569A}\x{569B}' + . '\x{569C}\x{569D}\x{569F}\x{56A0}\x{56A1}\x{56A3}\x{56A4}\x{56A5}\x{56A6}' + . '\x{56A7}\x{56A8}\x{56A9}\x{56AA}\x{56AB}\x{56AC}\x{56AD}\x{56AE}\x{56AF}' + . '\x{56B0}\x{56B1}\x{56B2}\x{56B3}\x{56B4}\x{56B5}\x{56B6}\x{56B7}\x{56B8}' + . '\x{56B9}\x{56BB}\x{56BC}\x{56BD}\x{56BE}\x{56BF}\x{56C0}\x{56C1}\x{56C2}' + . '\x{56C3}\x{56C4}\x{56C5}\x{56C6}\x{56C7}\x{56C8}\x{56C9}\x{56CA}\x{56CB}' + . '\x{56CC}\x{56CD}\x{56CE}\x{56D0}\x{56D1}\x{56D2}\x{56D3}\x{56D4}\x{56D5}' + . '\x{56D6}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DC}\x{56DD}\x{56DE}\x{56DF}' + . '\x{56E0}\x{56E1}\x{56E2}\x{56E3}\x{56E4}\x{56E5}\x{56E7}\x{56E8}\x{56E9}' + . '\x{56EA}\x{56EB}\x{56EC}\x{56ED}\x{56EE}\x{56EF}\x{56F0}\x{56F1}\x{56F2}' + . '\x{56F3}\x{56F4}\x{56F5}\x{56F7}\x{56F9}\x{56FA}\x{56FD}\x{56FE}\x{56FF}' + . '\x{5700}\x{5701}\x{5702}\x{5703}\x{5704}\x{5706}\x{5707}\x{5708}\x{5709}' + . '\x{570A}\x{570B}\x{570C}\x{570D}\x{570E}\x{570F}\x{5710}\x{5712}\x{5713}' + . '\x{5714}\x{5715}\x{5716}\x{5718}\x{5719}\x{571A}\x{571B}\x{571C}\x{571D}' + . '\x{571E}\x{571F}\x{5720}\x{5722}\x{5723}\x{5725}\x{5726}\x{5727}\x{5728}' + . '\x{5729}\x{572A}\x{572B}\x{572C}\x{572D}\x{572E}\x{572F}\x{5730}\x{5731}' + . '\x{5732}\x{5733}\x{5734}\x{5735}\x{5736}\x{5737}\x{5738}\x{5739}\x{573A}' + . '\x{573B}\x{573C}\x{573E}\x{573F}\x{5740}\x{5741}\x{5742}\x{5744}\x{5745}' + . '\x{5746}\x{5747}\x{5749}\x{574A}\x{574B}\x{574C}\x{574D}\x{574E}\x{574F}' + . '\x{5750}\x{5751}\x{5752}\x{5753}\x{5754}\x{5757}\x{5759}\x{575A}\x{575B}' + . '\x{575C}\x{575D}\x{575E}\x{575F}\x{5760}\x{5761}\x{5762}\x{5764}\x{5765}' + . '\x{5766}\x{5767}\x{5768}\x{5769}\x{576A}\x{576B}\x{576C}\x{576D}\x{576F}' + . '\x{5770}\x{5771}\x{5772}\x{5773}\x{5774}\x{5775}\x{5776}\x{5777}\x{5779}' + . '\x{577A}\x{577B}\x{577C}\x{577D}\x{577E}\x{577F}\x{5780}\x{5782}\x{5783}' + . '\x{5784}\x{5785}\x{5786}\x{5788}\x{5789}\x{578A}\x{578B}\x{578C}\x{578D}' + . '\x{578E}\x{578F}\x{5790}\x{5791}\x{5792}\x{5793}\x{5794}\x{5795}\x{5797}' + . '\x{5798}\x{5799}\x{579A}\x{579B}\x{579C}\x{579D}\x{579E}\x{579F}\x{57A0}' + . '\x{57A1}\x{57A2}\x{57A3}\x{57A4}\x{57A5}\x{57A6}\x{57A7}\x{57A9}\x{57AA}' + . '\x{57AB}\x{57AC}\x{57AD}\x{57AE}\x{57AF}\x{57B0}\x{57B1}\x{57B2}\x{57B3}' + . '\x{57B4}\x{57B5}\x{57B6}\x{57B7}\x{57B8}\x{57B9}\x{57BA}\x{57BB}\x{57BC}' + . '\x{57BD}\x{57BE}\x{57BF}\x{57C0}\x{57C1}\x{57C2}\x{57C3}\x{57C4}\x{57C5}' + . '\x{57C6}\x{57C7}\x{57C8}\x{57C9}\x{57CB}\x{57CC}\x{57CD}\x{57CE}\x{57CF}' + . '\x{57D0}\x{57D2}\x{57D3}\x{57D4}\x{57D5}\x{57D6}\x{57D8}\x{57D9}\x{57DA}' + . '\x{57DC}\x{57DD}\x{57DF}\x{57E0}\x{57E1}\x{57E2}\x{57E3}\x{57E4}\x{57E5}' + . '\x{57E6}\x{57E7}\x{57E8}\x{57E9}\x{57EA}\x{57EB}\x{57EC}\x{57ED}\x{57EE}' + . '\x{57EF}\x{57F0}\x{57F1}\x{57F2}\x{57F3}\x{57F4}\x{57F5}\x{57F6}\x{57F7}' + . '\x{57F8}\x{57F9}\x{57FA}\x{57FB}\x{57FC}\x{57FD}\x{57FE}\x{57FF}\x{5800}' + . '\x{5801}\x{5802}\x{5803}\x{5804}\x{5805}\x{5806}\x{5807}\x{5808}\x{5809}' + . '\x{580A}\x{580B}\x{580C}\x{580D}\x{580E}\x{580F}\x{5810}\x{5811}\x{5812}' + . '\x{5813}\x{5814}\x{5815}\x{5816}\x{5819}\x{581A}\x{581B}\x{581C}\x{581D}' + . '\x{581E}\x{581F}\x{5820}\x{5821}\x{5822}\x{5823}\x{5824}\x{5825}\x{5826}' + . '\x{5827}\x{5828}\x{5829}\x{582A}\x{582B}\x{582C}\x{582D}\x{582E}\x{582F}' + . '\x{5830}\x{5831}\x{5832}\x{5833}\x{5834}\x{5835}\x{5836}\x{5837}\x{5838}' + . '\x{5839}\x{583A}\x{583B}\x{583C}\x{583D}\x{583E}\x{583F}\x{5840}\x{5842}' + . '\x{5843}\x{5844}\x{5845}\x{5846}\x{5847}\x{5848}\x{5849}\x{584A}\x{584B}' + . '\x{584C}\x{584D}\x{584E}\x{584F}\x{5851}\x{5852}\x{5853}\x{5854}\x{5855}' + . '\x{5857}\x{5858}\x{5859}\x{585A}\x{585B}\x{585C}\x{585D}\x{585E}\x{585F}' + . '\x{5861}\x{5862}\x{5863}\x{5864}\x{5865}\x{5868}\x{5869}\x{586A}\x{586B}' + . '\x{586C}\x{586D}\x{586E}\x{586F}\x{5870}\x{5871}\x{5872}\x{5873}\x{5874}' + . '\x{5875}\x{5876}\x{5878}\x{5879}\x{587A}\x{587B}\x{587C}\x{587D}\x{587E}' + . '\x{587F}\x{5880}\x{5881}\x{5882}\x{5883}\x{5884}\x{5885}\x{5886}\x{5887}' + . '\x{5888}\x{5889}\x{588A}\x{588B}\x{588C}\x{588D}\x{588E}\x{588F}\x{5890}' + . '\x{5891}\x{5892}\x{5893}\x{5894}\x{5896}\x{5897}\x{5898}\x{5899}\x{589A}' + . '\x{589B}\x{589C}\x{589D}\x{589E}\x{589F}\x{58A0}\x{58A1}\x{58A2}\x{58A3}' + . '\x{58A4}\x{58A5}\x{58A6}\x{58A7}\x{58A8}\x{58A9}\x{58AB}\x{58AC}\x{58AD}' + . '\x{58AE}\x{58AF}\x{58B0}\x{58B1}\x{58B2}\x{58B3}\x{58B4}\x{58B7}\x{58B8}' + . '\x{58B9}\x{58BA}\x{58BB}\x{58BC}\x{58BD}\x{58BE}\x{58BF}\x{58C1}\x{58C2}' + . '\x{58C5}\x{58C6}\x{58C7}\x{58C8}\x{58C9}\x{58CA}\x{58CB}\x{58CE}\x{58CF}' + . '\x{58D1}\x{58D2}\x{58D3}\x{58D4}\x{58D5}\x{58D6}\x{58D7}\x{58D8}\x{58D9}' + . '\x{58DA}\x{58DB}\x{58DD}\x{58DE}\x{58DF}\x{58E0}\x{58E2}\x{58E3}\x{58E4}' + . '\x{58E5}\x{58E7}\x{58E8}\x{58E9}\x{58EA}\x{58EB}\x{58EC}\x{58ED}\x{58EE}' + . '\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F3}\x{58F4}\x{58F6}\x{58F7}\x{58F8}' + . '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{58FE}\x{58FF}\x{5900}\x{5902}' + . '\x{5903}\x{5904}\x{5906}\x{5907}\x{5909}\x{590A}\x{590B}\x{590C}\x{590D}' + . '\x{590E}\x{590F}\x{5910}\x{5912}\x{5914}\x{5915}\x{5916}\x{5917}\x{5918}' + . '\x{5919}\x{591A}\x{591B}\x{591C}\x{591D}\x{591E}\x{591F}\x{5920}\x{5921}' + . '\x{5922}\x{5924}\x{5925}\x{5926}\x{5927}\x{5928}\x{5929}\x{592A}\x{592B}' + . '\x{592C}\x{592D}\x{592E}\x{592F}\x{5930}\x{5931}\x{5932}\x{5934}\x{5935}' + . '\x{5937}\x{5938}\x{5939}\x{593A}\x{593B}\x{593C}\x{593D}\x{593E}\x{593F}' + . '\x{5940}\x{5941}\x{5942}\x{5943}\x{5944}\x{5945}\x{5946}\x{5947}\x{5948}' + . '\x{5949}\x{594A}\x{594B}\x{594C}\x{594D}\x{594E}\x{594F}\x{5950}\x{5951}' + . '\x{5952}\x{5953}\x{5954}\x{5955}\x{5956}\x{5957}\x{5958}\x{595A}\x{595C}' + . '\x{595D}\x{595E}\x{595F}\x{5960}\x{5961}\x{5962}\x{5963}\x{5964}\x{5965}' + . '\x{5966}\x{5967}\x{5968}\x{5969}\x{596A}\x{596B}\x{596C}\x{596D}\x{596E}' + . '\x{596F}\x{5970}\x{5971}\x{5972}\x{5973}\x{5974}\x{5975}\x{5976}\x{5977}' + . '\x{5978}\x{5979}\x{597A}\x{597B}\x{597C}\x{597D}\x{597E}\x{597F}\x{5980}' + . '\x{5981}\x{5982}\x{5983}\x{5984}\x{5985}\x{5986}\x{5987}\x{5988}\x{5989}' + . '\x{598A}\x{598B}\x{598C}\x{598D}\x{598E}\x{598F}\x{5990}\x{5991}\x{5992}' + . '\x{5993}\x{5994}\x{5995}\x{5996}\x{5997}\x{5998}\x{5999}\x{599A}\x{599C}' + . '\x{599D}\x{599E}\x{599F}\x{59A0}\x{59A1}\x{59A2}\x{59A3}\x{59A4}\x{59A5}' + . '\x{59A6}\x{59A7}\x{59A8}\x{59A9}\x{59AA}\x{59AB}\x{59AC}\x{59AD}\x{59AE}' + . '\x{59AF}\x{59B0}\x{59B1}\x{59B2}\x{59B3}\x{59B4}\x{59B5}\x{59B6}\x{59B8}' + . '\x{59B9}\x{59BA}\x{59BB}\x{59BC}\x{59BD}\x{59BE}\x{59BF}\x{59C0}\x{59C1}' + . '\x{59C2}\x{59C3}\x{59C4}\x{59C5}\x{59C6}\x{59C7}\x{59C8}\x{59C9}\x{59CA}' + . '\x{59CB}\x{59CC}\x{59CD}\x{59CE}\x{59CF}\x{59D0}\x{59D1}\x{59D2}\x{59D3}' + . '\x{59D4}\x{59D5}\x{59D6}\x{59D7}\x{59D8}\x{59D9}\x{59DA}\x{59DB}\x{59DC}' + . '\x{59DD}\x{59DE}\x{59DF}\x{59E0}\x{59E1}\x{59E2}\x{59E3}\x{59E4}\x{59E5}' + . '\x{59E6}\x{59E8}\x{59E9}\x{59EA}\x{59EB}\x{59EC}\x{59ED}\x{59EE}\x{59EF}' + . '\x{59F0}\x{59F1}\x{59F2}\x{59F3}\x{59F4}\x{59F5}\x{59F6}\x{59F7}\x{59F8}' + . '\x{59F9}\x{59FA}\x{59FB}\x{59FC}\x{59FD}\x{59FE}\x{59FF}\x{5A00}\x{5A01}' + . '\x{5A02}\x{5A03}\x{5A04}\x{5A05}\x{5A06}\x{5A07}\x{5A08}\x{5A09}\x{5A0A}' + . '\x{5A0B}\x{5A0C}\x{5A0D}\x{5A0E}\x{5A0F}\x{5A10}\x{5A11}\x{5A12}\x{5A13}' + . '\x{5A14}\x{5A15}\x{5A16}\x{5A17}\x{5A18}\x{5A19}\x{5A1A}\x{5A1B}\x{5A1C}' + . '\x{5A1D}\x{5A1E}\x{5A1F}\x{5A20}\x{5A21}\x{5A22}\x{5A23}\x{5A25}\x{5A27}' + . '\x{5A28}\x{5A29}\x{5A2A}\x{5A2B}\x{5A2D}\x{5A2E}\x{5A2F}\x{5A31}\x{5A32}' + . '\x{5A33}\x{5A34}\x{5A35}\x{5A36}\x{5A37}\x{5A38}\x{5A39}\x{5A3A}\x{5A3B}' + . '\x{5A3C}\x{5A3D}\x{5A3E}\x{5A3F}\x{5A40}\x{5A41}\x{5A42}\x{5A43}\x{5A44}' + . '\x{5A45}\x{5A46}\x{5A47}\x{5A48}\x{5A49}\x{5A4A}\x{5A4B}\x{5A4C}\x{5A4D}' + . '\x{5A4E}\x{5A4F}\x{5A50}\x{5A51}\x{5A52}\x{5A53}\x{5A55}\x{5A56}\x{5A57}' + . '\x{5A58}\x{5A5A}\x{5A5B}\x{5A5C}\x{5A5D}\x{5A5E}\x{5A5F}\x{5A60}\x{5A61}' + . '\x{5A62}\x{5A63}\x{5A64}\x{5A65}\x{5A66}\x{5A67}\x{5A68}\x{5A69}\x{5A6A}' + . '\x{5A6B}\x{5A6C}\x{5A6D}\x{5A6E}\x{5A70}\x{5A72}\x{5A73}\x{5A74}\x{5A75}' + . '\x{5A76}\x{5A77}\x{5A78}\x{5A79}\x{5A7A}\x{5A7B}\x{5A7C}\x{5A7D}\x{5A7E}' + . '\x{5A7F}\x{5A80}\x{5A81}\x{5A82}\x{5A83}\x{5A84}\x{5A85}\x{5A86}\x{5A88}' + . '\x{5A89}\x{5A8A}\x{5A8B}\x{5A8C}\x{5A8E}\x{5A8F}\x{5A90}\x{5A91}\x{5A92}' + . '\x{5A93}\x{5A94}\x{5A95}\x{5A96}\x{5A97}\x{5A98}\x{5A99}\x{5A9A}\x{5A9B}' + . '\x{5A9C}\x{5A9D}\x{5A9E}\x{5A9F}\x{5AA0}\x{5AA1}\x{5AA2}\x{5AA3}\x{5AA4}' + . '\x{5AA5}\x{5AA6}\x{5AA7}\x{5AA8}\x{5AA9}\x{5AAA}\x{5AAC}\x{5AAD}\x{5AAE}' + . '\x{5AAF}\x{5AB0}\x{5AB1}\x{5AB2}\x{5AB3}\x{5AB4}\x{5AB5}\x{5AB6}\x{5AB7}' + . '\x{5AB8}\x{5AB9}\x{5ABA}\x{5ABB}\x{5ABC}\x{5ABD}\x{5ABE}\x{5ABF}\x{5AC0}' + . '\x{5AC1}\x{5AC2}\x{5AC3}\x{5AC4}\x{5AC5}\x{5AC6}\x{5AC7}\x{5AC8}\x{5AC9}' + . '\x{5ACA}\x{5ACB}\x{5ACC}\x{5ACD}\x{5ACE}\x{5ACF}\x{5AD1}\x{5AD2}\x{5AD4}' + . '\x{5AD5}\x{5AD6}\x{5AD7}\x{5AD8}\x{5AD9}\x{5ADA}\x{5ADB}\x{5ADC}\x{5ADD}' + . '\x{5ADE}\x{5ADF}\x{5AE0}\x{5AE1}\x{5AE2}\x{5AE3}\x{5AE4}\x{5AE5}\x{5AE6}' + . '\x{5AE7}\x{5AE8}\x{5AE9}\x{5AEA}\x{5AEB}\x{5AEC}\x{5AED}\x{5AEE}\x{5AF1}' + . '\x{5AF2}\x{5AF3}\x{5AF4}\x{5AF5}\x{5AF6}\x{5AF7}\x{5AF8}\x{5AF9}\x{5AFA}' + . '\x{5AFB}\x{5AFC}\x{5AFD}\x{5AFE}\x{5AFF}\x{5B00}\x{5B01}\x{5B02}\x{5B03}' + . '\x{5B04}\x{5B05}\x{5B06}\x{5B07}\x{5B08}\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}' + . '\x{5B0F}\x{5B10}\x{5B11}\x{5B12}\x{5B13}\x{5B14}\x{5B15}\x{5B16}\x{5B17}' + . '\x{5B18}\x{5B19}\x{5B1A}\x{5B1B}\x{5B1C}\x{5B1D}\x{5B1E}\x{5B1F}\x{5B20}' + . '\x{5B21}\x{5B22}\x{5B23}\x{5B24}\x{5B25}\x{5B26}\x{5B27}\x{5B28}\x{5B29}' + . '\x{5B2A}\x{5B2B}\x{5B2C}\x{5B2D}\x{5B2E}\x{5B2F}\x{5B30}\x{5B31}\x{5B32}' + . '\x{5B33}\x{5B34}\x{5B35}\x{5B36}\x{5B37}\x{5B38}\x{5B3A}\x{5B3B}\x{5B3C}' + . '\x{5B3D}\x{5B3E}\x{5B3F}\x{5B40}\x{5B41}\x{5B42}\x{5B43}\x{5B44}\x{5B45}' + . '\x{5B47}\x{5B48}\x{5B49}\x{5B4A}\x{5B4B}\x{5B4C}\x{5B4D}\x{5B4E}\x{5B50}' + . '\x{5B51}\x{5B53}\x{5B54}\x{5B55}\x{5B56}\x{5B57}\x{5B58}\x{5B59}\x{5B5A}' + . '\x{5B5B}\x{5B5C}\x{5B5D}\x{5B5E}\x{5B5F}\x{5B62}\x{5B63}\x{5B64}\x{5B65}' + . '\x{5B66}\x{5B67}\x{5B68}\x{5B69}\x{5B6A}\x{5B6B}\x{5B6C}\x{5B6D}\x{5B6E}' + . '\x{5B70}\x{5B71}\x{5B72}\x{5B73}\x{5B74}\x{5B75}\x{5B76}\x{5B77}\x{5B78}' + . '\x{5B7A}\x{5B7B}\x{5B7C}\x{5B7D}\x{5B7F}\x{5B80}\x{5B81}\x{5B82}\x{5B83}' + . '\x{5B84}\x{5B85}\x{5B87}\x{5B88}\x{5B89}\x{5B8A}\x{5B8B}\x{5B8C}\x{5B8D}' + . '\x{5B8E}\x{5B8F}\x{5B91}\x{5B92}\x{5B93}\x{5B94}\x{5B95}\x{5B96}\x{5B97}' + . '\x{5B98}\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9E}\x{5B9F}\x{5BA0}' + . '\x{5BA1}\x{5BA2}\x{5BA3}\x{5BA4}\x{5BA5}\x{5BA6}\x{5BA7}\x{5BA8}\x{5BAA}' + . '\x{5BAB}\x{5BAC}\x{5BAD}\x{5BAE}\x{5BAF}\x{5BB0}\x{5BB1}\x{5BB3}\x{5BB4}' + . '\x{5BB5}\x{5BB6}\x{5BB8}\x{5BB9}\x{5BBA}\x{5BBB}\x{5BBD}\x{5BBE}\x{5BBF}' + . '\x{5BC0}\x{5BC1}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BCA}' + . '\x{5BCB}\x{5BCC}\x{5BCD}\x{5BCE}\x{5BCF}\x{5BD0}\x{5BD1}\x{5BD2}\x{5BD3}' + . '\x{5BD4}\x{5BD5}\x{5BD6}\x{5BD8}\x{5BD9}\x{5BDB}\x{5BDC}\x{5BDD}\x{5BDE}' + . '\x{5BDF}\x{5BE0}\x{5BE1}\x{5BE2}\x{5BE3}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}' + . '\x{5BE8}\x{5BE9}\x{5BEA}\x{5BEB}\x{5BEC}\x{5BED}\x{5BEE}\x{5BEF}\x{5BF0}' + . '\x{5BF1}\x{5BF2}\x{5BF3}\x{5BF4}\x{5BF5}\x{5BF6}\x{5BF7}\x{5BF8}\x{5BF9}' + . '\x{5BFA}\x{5BFB}\x{5BFC}\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}\x{5C04}\x{5C05}' + . '\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}\x{5C0B}\x{5C0C}\x{5C0D}\x{5C0E}' + . '\x{5C0F}\x{5C10}\x{5C11}\x{5C12}\x{5C13}\x{5C14}\x{5C15}\x{5C16}\x{5C17}' + . '\x{5C18}\x{5C19}\x{5C1A}\x{5C1C}\x{5C1D}\x{5C1E}\x{5C1F}\x{5C20}\x{5C21}' + . '\x{5C22}\x{5C24}\x{5C25}\x{5C27}\x{5C28}\x{5C2A}\x{5C2B}\x{5C2C}\x{5C2D}' + . '\x{5C2E}\x{5C2F}\x{5C30}\x{5C31}\x{5C32}\x{5C33}\x{5C34}\x{5C35}\x{5C37}' + . '\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}' + . '\x{5C41}\x{5C42}\x{5C43}\x{5C44}\x{5C45}\x{5C46}\x{5C47}\x{5C48}\x{5C49}' + . '\x{5C4A}\x{5C4B}\x{5C4C}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C52}' + . '\x{5C53}\x{5C54}\x{5C55}\x{5C56}\x{5C57}\x{5C58}\x{5C59}\x{5C5B}\x{5C5C}' + . '\x{5C5D}\x{5C5E}\x{5C5F}\x{5C60}\x{5C61}\x{5C62}\x{5C63}\x{5C64}\x{5C65}' + . '\x{5C66}\x{5C67}\x{5C68}\x{5C69}\x{5C6A}\x{5C6B}\x{5C6C}\x{5C6D}\x{5C6E}' + . '\x{5C6F}\x{5C70}\x{5C71}\x{5C72}\x{5C73}\x{5C74}\x{5C75}\x{5C76}\x{5C77}' + . '\x{5C78}\x{5C79}\x{5C7A}\x{5C7B}\x{5C7C}\x{5C7D}\x{5C7E}\x{5C7F}\x{5C80}' + . '\x{5C81}\x{5C82}\x{5C83}\x{5C84}\x{5C86}\x{5C87}\x{5C88}\x{5C89}\x{5C8A}' + . '\x{5C8B}\x{5C8C}\x{5C8D}\x{5C8E}\x{5C8F}\x{5C90}\x{5C91}\x{5C92}\x{5C93}' + . '\x{5C94}\x{5C95}\x{5C96}\x{5C97}\x{5C98}\x{5C99}\x{5C9A}\x{5C9B}\x{5C9C}' + . '\x{5C9D}\x{5C9E}\x{5C9F}\x{5CA0}\x{5CA1}\x{5CA2}\x{5CA3}\x{5CA4}\x{5CA5}' + . '\x{5CA6}\x{5CA7}\x{5CA8}\x{5CA9}\x{5CAA}\x{5CAB}\x{5CAC}\x{5CAD}\x{5CAE}' + . '\x{5CAF}\x{5CB0}\x{5CB1}\x{5CB2}\x{5CB3}\x{5CB5}\x{5CB6}\x{5CB7}\x{5CB8}' + . '\x{5CBA}\x{5CBB}\x{5CBC}\x{5CBD}\x{5CBE}\x{5CBF}\x{5CC1}\x{5CC2}\x{5CC3}' + . '\x{5CC4}\x{5CC5}\x{5CC6}\x{5CC7}\x{5CC8}\x{5CC9}\x{5CCA}\x{5CCB}\x{5CCC}' + . '\x{5CCD}\x{5CCE}\x{5CCF}\x{5CD0}\x{5CD1}\x{5CD2}\x{5CD3}\x{5CD4}\x{5CD6}' + . '\x{5CD7}\x{5CD8}\x{5CD9}\x{5CDA}\x{5CDB}\x{5CDC}\x{5CDE}\x{5CDF}\x{5CE0}' + . '\x{5CE1}\x{5CE2}\x{5CE3}\x{5CE4}\x{5CE5}\x{5CE6}\x{5CE7}\x{5CE8}\x{5CE9}' + . '\x{5CEA}\x{5CEB}\x{5CEC}\x{5CED}\x{5CEE}\x{5CEF}\x{5CF0}\x{5CF1}\x{5CF2}' + . '\x{5CF3}\x{5CF4}\x{5CF6}\x{5CF7}\x{5CF8}\x{5CF9}\x{5CFA}\x{5CFB}\x{5CFC}' + . '\x{5CFD}\x{5CFE}\x{5CFF}\x{5D00}\x{5D01}\x{5D02}\x{5D03}\x{5D04}\x{5D05}' + . '\x{5D06}\x{5D07}\x{5D08}\x{5D09}\x{5D0A}\x{5D0B}\x{5D0C}\x{5D0D}\x{5D0E}' + . '\x{5D0F}\x{5D10}\x{5D11}\x{5D12}\x{5D13}\x{5D14}\x{5D15}\x{5D16}\x{5D17}' + . '\x{5D18}\x{5D19}\x{5D1A}\x{5D1B}\x{5D1C}\x{5D1D}\x{5D1E}\x{5D1F}\x{5D20}' + . '\x{5D21}\x{5D22}\x{5D23}\x{5D24}\x{5D25}\x{5D26}\x{5D27}\x{5D28}\x{5D29}' + . '\x{5D2A}\x{5D2C}\x{5D2D}\x{5D2E}\x{5D30}\x{5D31}\x{5D32}\x{5D33}\x{5D34}' + . '\x{5D35}\x{5D36}\x{5D37}\x{5D38}\x{5D39}\x{5D3A}\x{5D3C}\x{5D3D}\x{5D3E}' + . '\x{5D3F}\x{5D40}\x{5D41}\x{5D42}\x{5D43}\x{5D44}\x{5D45}\x{5D46}\x{5D47}' + . '\x{5D48}\x{5D49}\x{5D4A}\x{5D4B}\x{5D4C}\x{5D4D}\x{5D4E}\x{5D4F}\x{5D50}' + . '\x{5D51}\x{5D52}\x{5D54}\x{5D55}\x{5D56}\x{5D58}\x{5D59}\x{5D5A}\x{5D5B}' + . '\x{5D5D}\x{5D5E}\x{5D5F}\x{5D61}\x{5D62}\x{5D63}\x{5D64}\x{5D65}\x{5D66}' + . '\x{5D67}\x{5D68}\x{5D69}\x{5D6A}\x{5D6B}\x{5D6C}\x{5D6D}\x{5D6E}\x{5D6F}' + . '\x{5D70}\x{5D71}\x{5D72}\x{5D73}\x{5D74}\x{5D75}\x{5D76}\x{5D77}\x{5D78}' + . '\x{5D79}\x{5D7A}\x{5D7B}\x{5D7C}\x{5D7D}\x{5D7E}\x{5D7F}\x{5D80}\x{5D81}' + . '\x{5D82}\x{5D84}\x{5D85}\x{5D86}\x{5D87}\x{5D88}\x{5D89}\x{5D8A}\x{5D8B}' + . '\x{5D8C}\x{5D8D}\x{5D8E}\x{5D8F}\x{5D90}\x{5D91}\x{5D92}\x{5D93}\x{5D94}' + . '\x{5D95}\x{5D97}\x{5D98}\x{5D99}\x{5D9A}\x{5D9B}\x{5D9C}\x{5D9D}\x{5D9E}' + . '\x{5D9F}\x{5DA0}\x{5DA1}\x{5DA2}\x{5DA5}\x{5DA6}\x{5DA7}\x{5DA8}\x{5DA9}' + . '\x{5DAA}\x{5DAC}\x{5DAD}\x{5DAE}\x{5DAF}\x{5DB0}\x{5DB1}\x{5DB2}\x{5DB4}' + . '\x{5DB5}\x{5DB6}\x{5DB7}\x{5DB8}\x{5DBA}\x{5DBB}\x{5DBC}\x{5DBD}\x{5DBE}' + . '\x{5DBF}\x{5DC0}\x{5DC1}\x{5DC2}\x{5DC3}\x{5DC5}\x{5DC6}\x{5DC7}\x{5DC8}' + . '\x{5DC9}\x{5DCA}\x{5DCB}\x{5DCC}\x{5DCD}\x{5DCE}\x{5DCF}\x{5DD0}\x{5DD1}' + . '\x{5DD2}\x{5DD3}\x{5DD4}\x{5DD5}\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}' + . '\x{5DDE}\x{5DDF}\x{5DE0}\x{5DE1}\x{5DE2}\x{5DE3}\x{5DE4}\x{5DE5}\x{5DE6}' + . '\x{5DE7}\x{5DE8}\x{5DE9}\x{5DEA}\x{5DEB}\x{5DEC}\x{5DED}\x{5DEE}\x{5DEF}' + . '\x{5DF0}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DF8}\x{5DF9}' + . '\x{5DFA}\x{5DFB}\x{5DFC}\x{5DFD}\x{5DFE}\x{5DFF}\x{5E00}\x{5E01}\x{5E02}' + . '\x{5E03}\x{5E04}\x{5E05}\x{5E06}\x{5E07}\x{5E08}\x{5E09}\x{5E0A}\x{5E0B}' + . '\x{5E0C}\x{5E0D}\x{5E0E}\x{5E0F}\x{5E10}\x{5E11}\x{5E13}\x{5E14}\x{5E15}' + . '\x{5E16}\x{5E17}\x{5E18}\x{5E19}\x{5E1A}\x{5E1B}\x{5E1C}\x{5E1D}\x{5E1E}' + . '\x{5E1F}\x{5E20}\x{5E21}\x{5E22}\x{5E23}\x{5E24}\x{5E25}\x{5E26}\x{5E27}' + . '\x{5E28}\x{5E29}\x{5E2A}\x{5E2B}\x{5E2C}\x{5E2D}\x{5E2E}\x{5E2F}\x{5E30}' + . '\x{5E31}\x{5E32}\x{5E33}\x{5E34}\x{5E35}\x{5E36}\x{5E37}\x{5E38}\x{5E39}' + . '\x{5E3A}\x{5E3B}\x{5E3C}\x{5E3D}\x{5E3E}\x{5E40}\x{5E41}\x{5E42}\x{5E43}' + . '\x{5E44}\x{5E45}\x{5E46}\x{5E47}\x{5E49}\x{5E4A}\x{5E4B}\x{5E4C}\x{5E4D}' + . '\x{5E4E}\x{5E4F}\x{5E50}\x{5E52}\x{5E53}\x{5E54}\x{5E55}\x{5E56}\x{5E57}' + . '\x{5E58}\x{5E59}\x{5E5A}\x{5E5B}\x{5E5C}\x{5E5D}\x{5E5E}\x{5E5F}\x{5E60}' + . '\x{5E61}\x{5E62}\x{5E63}\x{5E64}\x{5E65}\x{5E66}\x{5E67}\x{5E68}\x{5E69}' + . '\x{5E6A}\x{5E6B}\x{5E6C}\x{5E6D}\x{5E6E}\x{5E6F}\x{5E70}\x{5E71}\x{5E72}' + . '\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E77}\x{5E78}\x{5E79}\x{5E7A}\x{5E7B}' + . '\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E80}\x{5E81}\x{5E82}\x{5E83}\x{5E84}' + . '\x{5E85}\x{5E86}\x{5E87}\x{5E88}\x{5E89}\x{5E8A}\x{5E8B}\x{5E8C}\x{5E8D}' + . '\x{5E8E}\x{5E8F}\x{5E90}\x{5E91}\x{5E93}\x{5E94}\x{5E95}\x{5E96}\x{5E97}' + . '\x{5E98}\x{5E99}\x{5E9A}\x{5E9B}\x{5E9C}\x{5E9D}\x{5E9E}\x{5E9F}\x{5EA0}' + . '\x{5EA1}\x{5EA2}\x{5EA3}\x{5EA4}\x{5EA5}\x{5EA6}\x{5EA7}\x{5EA8}\x{5EA9}' + . '\x{5EAA}\x{5EAB}\x{5EAC}\x{5EAD}\x{5EAE}\x{5EAF}\x{5EB0}\x{5EB1}\x{5EB2}' + . '\x{5EB3}\x{5EB4}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EB9}\x{5EBB}\x{5EBC}' + . '\x{5EBD}\x{5EBE}\x{5EBF}\x{5EC1}\x{5EC2}\x{5EC3}\x{5EC4}\x{5EC5}\x{5EC6}' + . '\x{5EC7}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECB}\x{5ECC}\x{5ECD}\x{5ECE}\x{5ECF}' + . '\x{5ED0}\x{5ED1}\x{5ED2}\x{5ED3}\x{5ED4}\x{5ED5}\x{5ED6}\x{5ED7}\x{5ED8}' + . '\x{5ED9}\x{5EDA}\x{5EDB}\x{5EDC}\x{5EDD}\x{5EDE}\x{5EDF}\x{5EE0}\x{5EE1}' + . '\x{5EE2}\x{5EE3}\x{5EE4}\x{5EE5}\x{5EE6}\x{5EE7}\x{5EE8}\x{5EE9}\x{5EEA}' + . '\x{5EEC}\x{5EED}\x{5EEE}\x{5EEF}\x{5EF0}\x{5EF1}\x{5EF2}\x{5EF3}\x{5EF4}' + . '\x{5EF5}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}\x{5EFB}\x{5EFC}\x{5EFD}\x{5EFE}' + . '\x{5EFF}\x{5F00}\x{5F01}\x{5F02}\x{5F03}\x{5F04}\x{5F05}\x{5F06}\x{5F07}' + . '\x{5F08}\x{5F0A}\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F11}\x{5F12}\x{5F13}' + . '\x{5F14}\x{5F15}\x{5F16}\x{5F17}\x{5F18}\x{5F19}\x{5F1A}\x{5F1B}\x{5F1C}' + . '\x{5F1D}\x{5F1E}\x{5F1F}\x{5F20}\x{5F21}\x{5F22}\x{5F23}\x{5F24}\x{5F25}' + . '\x{5F26}\x{5F27}\x{5F28}\x{5F29}\x{5F2A}\x{5F2B}\x{5F2C}\x{5F2D}\x{5F2E}' + . '\x{5F2F}\x{5F30}\x{5F31}\x{5F32}\x{5F33}\x{5F34}\x{5F35}\x{5F36}\x{5F37}' + . '\x{5F38}\x{5F39}\x{5F3A}\x{5F3C}\x{5F3E}\x{5F3F}\x{5F40}\x{5F41}\x{5F42}' + . '\x{5F43}\x{5F44}\x{5F45}\x{5F46}\x{5F47}\x{5F48}\x{5F49}\x{5F4A}\x{5F4B}' + . '\x{5F4C}\x{5F4D}\x{5F4E}\x{5F4F}\x{5F50}\x{5F51}\x{5F52}\x{5F53}\x{5F54}' + . '\x{5F55}\x{5F56}\x{5F57}\x{5F58}\x{5F59}\x{5F5A}\x{5F5B}\x{5F5C}\x{5F5D}' + . '\x{5F5E}\x{5F5F}\x{5F60}\x{5F61}\x{5F62}\x{5F63}\x{5F64}\x{5F65}\x{5F66}' + . '\x{5F67}\x{5F68}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}\x{5F6D}\x{5F6E}\x{5F6F}' + . '\x{5F70}\x{5F71}\x{5F72}\x{5F73}\x{5F74}\x{5F75}\x{5F76}\x{5F77}\x{5F78}' + . '\x{5F79}\x{5F7A}\x{5F7B}\x{5F7C}\x{5F7D}\x{5F7E}\x{5F7F}\x{5F80}\x{5F81}' + . '\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F86}\x{5F87}\x{5F88}\x{5F89}\x{5F8A}' + . '\x{5F8B}\x{5F8C}\x{5F8D}\x{5F8E}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F94}' + . '\x{5F95}\x{5F96}\x{5F97}\x{5F98}\x{5F99}\x{5F9B}\x{5F9C}\x{5F9D}\x{5F9E}' + . '\x{5F9F}\x{5FA0}\x{5FA1}\x{5FA2}\x{5FA5}\x{5FA6}\x{5FA7}\x{5FA8}\x{5FA9}' + . '\x{5FAA}\x{5FAB}\x{5FAC}\x{5FAD}\x{5FAE}\x{5FAF}\x{5FB1}\x{5FB2}\x{5FB3}' + . '\x{5FB4}\x{5FB5}\x{5FB6}\x{5FB7}\x{5FB8}\x{5FB9}\x{5FBA}\x{5FBB}\x{5FBC}' + . '\x{5FBD}\x{5FBE}\x{5FBF}\x{5FC0}\x{5FC1}\x{5FC3}\x{5FC4}\x{5FC5}\x{5FC6}' + . '\x{5FC7}\x{5FC8}\x{5FC9}\x{5FCA}\x{5FCB}\x{5FCC}\x{5FCD}\x{5FCF}\x{5FD0}' + . '\x{5FD1}\x{5FD2}\x{5FD3}\x{5FD4}\x{5FD5}\x{5FD6}\x{5FD7}\x{5FD8}\x{5FD9}' + . '\x{5FDA}\x{5FDC}\x{5FDD}\x{5FDE}\x{5FE0}\x{5FE1}\x{5FE3}\x{5FE4}\x{5FE5}' + . '\x{5FE6}\x{5FE7}\x{5FE8}\x{5FE9}\x{5FEA}\x{5FEB}\x{5FED}\x{5FEE}\x{5FEF}' + . '\x{5FF0}\x{5FF1}\x{5FF2}\x{5FF3}\x{5FF4}\x{5FF5}\x{5FF6}\x{5FF7}\x{5FF8}' + . '\x{5FF9}\x{5FFA}\x{5FFB}\x{5FFD}\x{5FFE}\x{5FFF}\x{6000}\x{6001}\x{6002}' + . '\x{6003}\x{6004}\x{6005}\x{6006}\x{6007}\x{6008}\x{6009}\x{600A}\x{600B}' + . '\x{600C}\x{600D}\x{600E}\x{600F}\x{6010}\x{6011}\x{6012}\x{6013}\x{6014}' + . '\x{6015}\x{6016}\x{6017}\x{6018}\x{6019}\x{601A}\x{601B}\x{601C}\x{601D}' + . '\x{601E}\x{601F}\x{6020}\x{6021}\x{6022}\x{6024}\x{6025}\x{6026}\x{6027}' + . '\x{6028}\x{6029}\x{602A}\x{602B}\x{602C}\x{602D}\x{602E}\x{602F}\x{6030}' + . '\x{6031}\x{6032}\x{6033}\x{6034}\x{6035}\x{6036}\x{6037}\x{6038}\x{6039}' + . '\x{603A}\x{603B}\x{603C}\x{603D}\x{603E}\x{603F}\x{6040}\x{6041}\x{6042}' + . '\x{6043}\x{6044}\x{6045}\x{6046}\x{6047}\x{6048}\x{6049}\x{604A}\x{604B}' + . '\x{604C}\x{604D}\x{604E}\x{604F}\x{6050}\x{6051}\x{6052}\x{6053}\x{6054}' + . '\x{6055}\x{6057}\x{6058}\x{6059}\x{605A}\x{605B}\x{605C}\x{605D}\x{605E}' + . '\x{605F}\x{6062}\x{6063}\x{6064}\x{6065}\x{6066}\x{6067}\x{6068}\x{6069}' + . '\x{606A}\x{606B}\x{606C}\x{606D}\x{606E}\x{606F}\x{6070}\x{6072}\x{6073}' + . '\x{6075}\x{6076}\x{6077}\x{6078}\x{6079}\x{607A}\x{607B}\x{607C}\x{607D}' + . '\x{607E}\x{607F}\x{6080}\x{6081}\x{6082}\x{6083}\x{6084}\x{6085}\x{6086}' + . '\x{6087}\x{6088}\x{6089}\x{608A}\x{608B}\x{608C}\x{608D}\x{608E}\x{608F}' + . '\x{6090}\x{6092}\x{6094}\x{6095}\x{6096}\x{6097}\x{6098}\x{6099}\x{609A}' + . '\x{609B}\x{609C}\x{609D}\x{609E}\x{609F}\x{60A0}\x{60A1}\x{60A2}\x{60A3}' + . '\x{60A4}\x{60A6}\x{60A7}\x{60A8}\x{60AA}\x{60AB}\x{60AC}\x{60AD}\x{60AE}' + . '\x{60AF}\x{60B0}\x{60B1}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B7}' + . '\x{60B8}\x{60B9}\x{60BA}\x{60BB}\x{60BC}\x{60BD}\x{60BE}\x{60BF}\x{60C0}' + . '\x{60C1}\x{60C2}\x{60C3}\x{60C4}\x{60C5}\x{60C6}\x{60C7}\x{60C8}\x{60C9}' + . '\x{60CA}\x{60CB}\x{60CC}\x{60CD}\x{60CE}\x{60CF}\x{60D0}\x{60D1}\x{60D3}' + . '\x{60D4}\x{60D5}\x{60D7}\x{60D8}\x{60D9}\x{60DA}\x{60DB}\x{60DC}\x{60DD}' + . '\x{60DF}\x{60E0}\x{60E1}\x{60E2}\x{60E4}\x{60E6}\x{60E7}\x{60E8}\x{60E9}' + . '\x{60EA}\x{60EB}\x{60EC}\x{60ED}\x{60EE}\x{60EF}\x{60F0}\x{60F1}\x{60F2}' + . '\x{60F3}\x{60F4}\x{60F5}\x{60F6}\x{60F7}\x{60F8}\x{60F9}\x{60FA}\x{60FB}' + . '\x{60FC}\x{60FE}\x{60FF}\x{6100}\x{6101}\x{6103}\x{6104}\x{6105}\x{6106}' + . '\x{6108}\x{6109}\x{610A}\x{610B}\x{610C}\x{610D}\x{610E}\x{610F}\x{6110}' + . '\x{6112}\x{6113}\x{6114}\x{6115}\x{6116}\x{6117}\x{6118}\x{6119}\x{611A}' + . '\x{611B}\x{611C}\x{611D}\x{611F}\x{6120}\x{6122}\x{6123}\x{6124}\x{6125}' + . '\x{6126}\x{6127}\x{6128}\x{6129}\x{612A}\x{612B}\x{612C}\x{612D}\x{612E}' + . '\x{612F}\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}\x{613B}\x{613C}' + . '\x{613D}\x{613E}\x{613F}\x{6140}\x{6141}\x{6142}\x{6143}\x{6144}\x{6145}' + . '\x{6146}\x{6147}\x{6148}\x{6149}\x{614A}\x{614B}\x{614C}\x{614D}\x{614E}' + . '\x{614F}\x{6150}\x{6151}\x{6152}\x{6153}\x{6154}\x{6155}\x{6156}\x{6157}' + . '\x{6158}\x{6159}\x{615A}\x{615B}\x{615C}\x{615D}\x{615E}\x{615F}\x{6161}' + . '\x{6162}\x{6163}\x{6164}\x{6165}\x{6166}\x{6167}\x{6168}\x{6169}\x{616A}' + . '\x{616B}\x{616C}\x{616D}\x{616E}\x{6170}\x{6171}\x{6172}\x{6173}\x{6174}' + . '\x{6175}\x{6176}\x{6177}\x{6178}\x{6179}\x{617A}\x{617C}\x{617E}\x{6180}' + . '\x{6181}\x{6182}\x{6183}\x{6184}\x{6185}\x{6187}\x{6188}\x{6189}\x{618A}' + . '\x{618B}\x{618C}\x{618D}\x{618E}\x{618F}\x{6190}\x{6191}\x{6192}\x{6193}' + . '\x{6194}\x{6195}\x{6196}\x{6198}\x{6199}\x{619A}\x{619B}\x{619D}\x{619E}' + . '\x{619F}\x{61A0}\x{61A1}\x{61A2}\x{61A3}\x{61A4}\x{61A5}\x{61A6}\x{61A7}' + . '\x{61A8}\x{61A9}\x{61AA}\x{61AB}\x{61AC}\x{61AD}\x{61AE}\x{61AF}\x{61B0}' + . '\x{61B1}\x{61B2}\x{61B3}\x{61B4}\x{61B5}\x{61B6}\x{61B7}\x{61B8}\x{61BA}' + . '\x{61BC}\x{61BD}\x{61BE}\x{61BF}\x{61C0}\x{61C1}\x{61C2}\x{61C3}\x{61C4}' + . '\x{61C5}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' + . '\x{61CE}\x{61CF}\x{61D0}\x{61D1}\x{61D2}\x{61D4}\x{61D6}\x{61D7}\x{61D8}' + . '\x{61D9}\x{61DA}\x{61DB}\x{61DC}\x{61DD}\x{61DE}\x{61DF}\x{61E0}\x{61E1}' + . '\x{61E2}\x{61E3}\x{61E4}\x{61E5}\x{61E6}\x{61E7}\x{61E8}\x{61E9}\x{61EA}' + . '\x{61EB}\x{61ED}\x{61EE}\x{61F0}\x{61F1}\x{61F2}\x{61F3}\x{61F5}\x{61F6}' + . '\x{61F7}\x{61F8}\x{61F9}\x{61FA}\x{61FB}\x{61FC}\x{61FD}\x{61FE}\x{61FF}' + . '\x{6200}\x{6201}\x{6202}\x{6203}\x{6204}\x{6206}\x{6207}\x{6208}\x{6209}' + . '\x{620A}\x{620B}\x{620C}\x{620D}\x{620E}\x{620F}\x{6210}\x{6211}\x{6212}' + . '\x{6213}\x{6214}\x{6215}\x{6216}\x{6217}\x{6218}\x{6219}\x{621A}\x{621B}' + . '\x{621C}\x{621D}\x{621E}\x{621F}\x{6220}\x{6221}\x{6222}\x{6223}\x{6224}' + . '\x{6225}\x{6226}\x{6227}\x{6228}\x{6229}\x{622A}\x{622B}\x{622C}\x{622D}' + . '\x{622E}\x{622F}\x{6230}\x{6231}\x{6232}\x{6233}\x{6234}\x{6236}\x{6237}' + . '\x{6238}\x{623A}\x{623B}\x{623C}\x{623D}\x{623E}\x{623F}\x{6240}\x{6241}' + . '\x{6242}\x{6243}\x{6244}\x{6245}\x{6246}\x{6247}\x{6248}\x{6249}\x{624A}' + . '\x{624B}\x{624C}\x{624D}\x{624E}\x{624F}\x{6250}\x{6251}\x{6252}\x{6253}' + . '\x{6254}\x{6255}\x{6256}\x{6258}\x{6259}\x{625A}\x{625B}\x{625C}\x{625D}' + . '\x{625E}\x{625F}\x{6260}\x{6261}\x{6262}\x{6263}\x{6264}\x{6265}\x{6266}' + . '\x{6267}\x{6268}\x{6269}\x{626A}\x{626B}\x{626C}\x{626D}\x{626E}\x{626F}' + . '\x{6270}\x{6271}\x{6272}\x{6273}\x{6274}\x{6275}\x{6276}\x{6277}\x{6278}' + . '\x{6279}\x{627A}\x{627B}\x{627C}\x{627D}\x{627E}\x{627F}\x{6280}\x{6281}' + . '\x{6283}\x{6284}\x{6285}\x{6286}\x{6287}\x{6288}\x{6289}\x{628A}\x{628B}' + . '\x{628C}\x{628E}\x{628F}\x{6290}\x{6291}\x{6292}\x{6293}\x{6294}\x{6295}' + . '\x{6296}\x{6297}\x{6298}\x{6299}\x{629A}\x{629B}\x{629C}\x{629E}\x{629F}' + . '\x{62A0}\x{62A1}\x{62A2}\x{62A3}\x{62A4}\x{62A5}\x{62A7}\x{62A8}\x{62A9}' + . '\x{62AA}\x{62AB}\x{62AC}\x{62AD}\x{62AE}\x{62AF}\x{62B0}\x{62B1}\x{62B2}' + . '\x{62B3}\x{62B4}\x{62B5}\x{62B6}\x{62B7}\x{62B8}\x{62B9}\x{62BA}\x{62BB}' + . '\x{62BC}\x{62BD}\x{62BE}\x{62BF}\x{62C0}\x{62C1}\x{62C2}\x{62C3}\x{62C4}' + . '\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CB}\x{62CC}\x{62CD}' + . '\x{62CE}\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D5}\x{62D6}' + . '\x{62D7}\x{62D8}\x{62D9}\x{62DA}\x{62DB}\x{62DC}\x{62DD}\x{62DF}\x{62E0}' + . '\x{62E1}\x{62E2}\x{62E3}\x{62E4}\x{62E5}\x{62E6}\x{62E7}\x{62E8}\x{62E9}' + . '\x{62EB}\x{62EC}\x{62ED}\x{62EE}\x{62EF}\x{62F0}\x{62F1}\x{62F2}\x{62F3}' + . '\x{62F4}\x{62F5}\x{62F6}\x{62F7}\x{62F8}\x{62F9}\x{62FA}\x{62FB}\x{62FC}' + . '\x{62FD}\x{62FE}\x{62FF}\x{6300}\x{6301}\x{6302}\x{6303}\x{6304}\x{6305}' + . '\x{6306}\x{6307}\x{6308}\x{6309}\x{630B}\x{630C}\x{630D}\x{630E}\x{630F}' + . '\x{6310}\x{6311}\x{6312}\x{6313}\x{6314}\x{6315}\x{6316}\x{6318}\x{6319}' + . '\x{631A}\x{631B}\x{631C}\x{631D}\x{631E}\x{631F}\x{6320}\x{6321}\x{6322}' + . '\x{6323}\x{6324}\x{6325}\x{6326}\x{6327}\x{6328}\x{6329}\x{632A}\x{632B}' + . '\x{632C}\x{632D}\x{632E}\x{632F}\x{6330}\x{6332}\x{6333}\x{6334}\x{6336}' + . '\x{6338}\x{6339}\x{633A}\x{633B}\x{633C}\x{633D}\x{633E}\x{6340}\x{6341}' + . '\x{6342}\x{6343}\x{6344}\x{6345}\x{6346}\x{6347}\x{6348}\x{6349}\x{634A}' + . '\x{634B}\x{634C}\x{634D}\x{634E}\x{634F}\x{6350}\x{6351}\x{6352}\x{6353}' + . '\x{6354}\x{6355}\x{6356}\x{6357}\x{6358}\x{6359}\x{635A}\x{635C}\x{635D}' + . '\x{635E}\x{635F}\x{6360}\x{6361}\x{6362}\x{6363}\x{6364}\x{6365}\x{6366}' + . '\x{6367}\x{6368}\x{6369}\x{636A}\x{636B}\x{636C}\x{636D}\x{636E}\x{636F}' + . '\x{6370}\x{6371}\x{6372}\x{6373}\x{6374}\x{6375}\x{6376}\x{6377}\x{6378}' + . '\x{6379}\x{637A}\x{637B}\x{637C}\x{637D}\x{637E}\x{6380}\x{6381}\x{6382}' + . '\x{6383}\x{6384}\x{6385}\x{6386}\x{6387}\x{6388}\x{6389}\x{638A}\x{638C}' + . '\x{638D}\x{638E}\x{638F}\x{6390}\x{6391}\x{6392}\x{6394}\x{6395}\x{6396}' + . '\x{6397}\x{6398}\x{6399}\x{639A}\x{639B}\x{639C}\x{639D}\x{639E}\x{639F}' + . '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A4}\x{63A5}\x{63A6}\x{63A7}\x{63A8}' + . '\x{63A9}\x{63AA}\x{63AB}\x{63AC}\x{63AD}\x{63AE}\x{63AF}\x{63B0}\x{63B1}' + . '\x{63B2}\x{63B3}\x{63B4}\x{63B5}\x{63B6}\x{63B7}\x{63B8}\x{63B9}\x{63BA}' + . '\x{63BC}\x{63BD}\x{63BE}\x{63BF}\x{63C0}\x{63C1}\x{63C2}\x{63C3}\x{63C4}' + . '\x{63C5}\x{63C6}\x{63C7}\x{63C8}\x{63C9}\x{63CA}\x{63CB}\x{63CC}\x{63CD}' + . '\x{63CE}\x{63CF}\x{63D0}\x{63D2}\x{63D3}\x{63D4}\x{63D5}\x{63D6}\x{63D7}' + . '\x{63D8}\x{63D9}\x{63DA}\x{63DB}\x{63DC}\x{63DD}\x{63DE}\x{63DF}\x{63E0}' + . '\x{63E1}\x{63E2}\x{63E3}\x{63E4}\x{63E5}\x{63E6}\x{63E7}\x{63E8}\x{63E9}' + . '\x{63EA}\x{63EB}\x{63EC}\x{63ED}\x{63EE}\x{63EF}\x{63F0}\x{63F1}\x{63F2}' + . '\x{63F3}\x{63F4}\x{63F5}\x{63F6}\x{63F7}\x{63F8}\x{63F9}\x{63FA}\x{63FB}' + . '\x{63FC}\x{63FD}\x{63FE}\x{63FF}\x{6400}\x{6401}\x{6402}\x{6403}\x{6404}' + . '\x{6405}\x{6406}\x{6408}\x{6409}\x{640A}\x{640B}\x{640C}\x{640D}\x{640E}' + . '\x{640F}\x{6410}\x{6411}\x{6412}\x{6413}\x{6414}\x{6415}\x{6416}\x{6417}' + . '\x{6418}\x{6419}\x{641A}\x{641B}\x{641C}\x{641D}\x{641E}\x{641F}\x{6420}' + . '\x{6421}\x{6422}\x{6423}\x{6424}\x{6425}\x{6426}\x{6427}\x{6428}\x{6429}' + . '\x{642A}\x{642B}\x{642C}\x{642D}\x{642E}\x{642F}\x{6430}\x{6431}\x{6432}' + . '\x{6433}\x{6434}\x{6435}\x{6436}\x{6437}\x{6438}\x{6439}\x{643A}\x{643D}' + . '\x{643E}\x{643F}\x{6440}\x{6441}\x{6443}\x{6444}\x{6445}\x{6446}\x{6447}' + . '\x{6448}\x{644A}\x{644B}\x{644C}\x{644D}\x{644E}\x{644F}\x{6450}\x{6451}' + . '\x{6452}\x{6453}\x{6454}\x{6455}\x{6456}\x{6457}\x{6458}\x{6459}\x{645B}' + . '\x{645C}\x{645D}\x{645E}\x{645F}\x{6460}\x{6461}\x{6462}\x{6463}\x{6464}' + . '\x{6465}\x{6466}\x{6467}\x{6468}\x{6469}\x{646A}\x{646B}\x{646C}\x{646D}' + . '\x{646E}\x{646F}\x{6470}\x{6471}\x{6472}\x{6473}\x{6474}\x{6475}\x{6476}' + . '\x{6477}\x{6478}\x{6479}\x{647A}\x{647B}\x{647C}\x{647D}\x{647F}\x{6480}' + . '\x{6481}\x{6482}\x{6483}\x{6484}\x{6485}\x{6487}\x{6488}\x{6489}\x{648A}' + . '\x{648B}\x{648C}\x{648D}\x{648E}\x{648F}\x{6490}\x{6491}\x{6492}\x{6493}' + . '\x{6494}\x{6495}\x{6496}\x{6497}\x{6498}\x{6499}\x{649A}\x{649B}\x{649C}' + . '\x{649D}\x{649E}\x{649F}\x{64A0}\x{64A2}\x{64A3}\x{64A4}\x{64A5}\x{64A6}' + . '\x{64A7}\x{64A8}\x{64A9}\x{64AA}\x{64AB}\x{64AC}\x{64AD}\x{64AE}\x{64B0}' + . '\x{64B1}\x{64B2}\x{64B3}\x{64B4}\x{64B5}\x{64B7}\x{64B8}\x{64B9}\x{64BA}' + . '\x{64BB}\x{64BC}\x{64BD}\x{64BE}\x{64BF}\x{64C0}\x{64C1}\x{64C2}\x{64C3}' + . '\x{64C4}\x{64C5}\x{64C6}\x{64C7}\x{64C9}\x{64CA}\x{64CB}\x{64CC}\x{64CD}' + . '\x{64CE}\x{64CF}\x{64D0}\x{64D1}\x{64D2}\x{64D3}\x{64D4}\x{64D6}\x{64D7}' + . '\x{64D8}\x{64D9}\x{64DA}\x{64DB}\x{64DC}\x{64DD}\x{64DE}\x{64DF}\x{64E0}' + . '\x{64E2}\x{64E3}\x{64E4}\x{64E6}\x{64E7}\x{64E8}\x{64E9}\x{64EA}\x{64EB}' + . '\x{64EC}\x{64ED}\x{64EF}\x{64F0}\x{64F1}\x{64F2}\x{64F3}\x{64F4}\x{64F6}' + . '\x{64F7}\x{64F8}\x{64FA}\x{64FB}\x{64FC}\x{64FD}\x{64FE}\x{64FF}\x{6500}' + . '\x{6501}\x{6503}\x{6504}\x{6505}\x{6506}\x{6507}\x{6508}\x{6509}\x{650B}' + . '\x{650C}\x{650D}\x{650E}\x{650F}\x{6510}\x{6511}\x{6512}\x{6513}\x{6514}' + . '\x{6515}\x{6516}\x{6517}\x{6518}\x{6519}\x{651A}\x{651B}\x{651C}\x{651D}' + . '\x{651E}\x{6520}\x{6521}\x{6522}\x{6523}\x{6524}\x{6525}\x{6526}\x{6527}' + . '\x{6529}\x{652A}\x{652B}\x{652C}\x{652D}\x{652E}\x{652F}\x{6530}\x{6531}' + . '\x{6532}\x{6533}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}\x{653A}' + . '\x{653B}\x{653C}\x{653D}\x{653E}\x{653F}\x{6541}\x{6543}\x{6544}\x{6545}' + . '\x{6546}\x{6547}\x{6548}\x{6549}\x{654A}\x{654B}\x{654C}\x{654D}\x{654E}' + . '\x{654F}\x{6550}\x{6551}\x{6552}\x{6553}\x{6554}\x{6555}\x{6556}\x{6557}' + . '\x{6558}\x{6559}\x{655B}\x{655C}\x{655D}\x{655E}\x{6560}\x{6561}\x{6562}' + . '\x{6563}\x{6564}\x{6565}\x{6566}\x{6567}\x{6568}\x{6569}\x{656A}\x{656B}' + . '\x{656C}\x{656E}\x{656F}\x{6570}\x{6571}\x{6572}\x{6573}\x{6574}\x{6575}' + . '\x{6576}\x{6577}\x{6578}\x{6579}\x{657A}\x{657B}\x{657C}\x{657E}\x{657F}' + . '\x{6580}\x{6581}\x{6582}\x{6583}\x{6584}\x{6585}\x{6586}\x{6587}\x{6588}' + . '\x{6589}\x{658B}\x{658C}\x{658D}\x{658E}\x{658F}\x{6590}\x{6591}\x{6592}' + . '\x{6593}\x{6594}\x{6595}\x{6596}\x{6597}\x{6598}\x{6599}\x{659B}\x{659C}' + . '\x{659D}\x{659E}\x{659F}\x{65A0}\x{65A1}\x{65A2}\x{65A3}\x{65A4}\x{65A5}' + . '\x{65A6}\x{65A7}\x{65A8}\x{65A9}\x{65AA}\x{65AB}\x{65AC}\x{65AD}\x{65AE}' + . '\x{65AF}\x{65B0}\x{65B1}\x{65B2}\x{65B3}\x{65B4}\x{65B6}\x{65B7}\x{65B8}' + . '\x{65B9}\x{65BA}\x{65BB}\x{65BC}\x{65BD}\x{65BF}\x{65C0}\x{65C1}\x{65C2}' + . '\x{65C3}\x{65C4}\x{65C5}\x{65C6}\x{65C7}\x{65CA}\x{65CB}\x{65CC}\x{65CD}' + . '\x{65CE}\x{65CF}\x{65D0}\x{65D2}\x{65D3}\x{65D4}\x{65D5}\x{65D6}\x{65D7}' + . '\x{65DA}\x{65DB}\x{65DD}\x{65DE}\x{65DF}\x{65E0}\x{65E1}\x{65E2}\x{65E3}' + . '\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}\x{65EB}\x{65EC}\x{65ED}\x{65EE}' + . '\x{65EF}\x{65F0}\x{65F1}\x{65F2}\x{65F3}\x{65F4}\x{65F5}\x{65F6}\x{65F7}' + . '\x{65F8}\x{65FA}\x{65FB}\x{65FC}\x{65FD}\x{6600}\x{6601}\x{6602}\x{6603}' + . '\x{6604}\x{6605}\x{6606}\x{6607}\x{6608}\x{6609}\x{660A}\x{660B}\x{660C}' + . '\x{660D}\x{660E}\x{660F}\x{6610}\x{6611}\x{6612}\x{6613}\x{6614}\x{6615}' + . '\x{6616}\x{6618}\x{6619}\x{661A}\x{661B}\x{661C}\x{661D}\x{661F}\x{6620}' + . '\x{6621}\x{6622}\x{6623}\x{6624}\x{6625}\x{6626}\x{6627}\x{6628}\x{6629}' + . '\x{662A}\x{662B}\x{662D}\x{662E}\x{662F}\x{6630}\x{6631}\x{6632}\x{6633}' + . '\x{6634}\x{6635}\x{6636}\x{6639}\x{663A}\x{663C}\x{663D}\x{663E}\x{6640}' + . '\x{6641}\x{6642}\x{6643}\x{6644}\x{6645}\x{6646}\x{6647}\x{6649}\x{664A}' + . '\x{664B}\x{664C}\x{664E}\x{664F}\x{6650}\x{6651}\x{6652}\x{6653}\x{6654}' + . '\x{6655}\x{6656}\x{6657}\x{6658}\x{6659}\x{665A}\x{665B}\x{665C}\x{665D}' + . '\x{665E}\x{665F}\x{6661}\x{6662}\x{6664}\x{6665}\x{6666}\x{6668}\x{6669}' + . '\x{666A}\x{666B}\x{666C}\x{666D}\x{666E}\x{666F}\x{6670}\x{6671}\x{6672}' + . '\x{6673}\x{6674}\x{6675}\x{6676}\x{6677}\x{6678}\x{6679}\x{667A}\x{667B}' + . '\x{667C}\x{667D}\x{667E}\x{667F}\x{6680}\x{6681}\x{6682}\x{6683}\x{6684}' + . '\x{6685}\x{6686}\x{6687}\x{6688}\x{6689}\x{668A}\x{668B}\x{668C}\x{668D}' + . '\x{668E}\x{668F}\x{6690}\x{6691}\x{6693}\x{6694}\x{6695}\x{6696}\x{6697}' + . '\x{6698}\x{6699}\x{669A}\x{669B}\x{669D}\x{669F}\x{66A0}\x{66A1}\x{66A2}' + . '\x{66A3}\x{66A4}\x{66A5}\x{66A6}\x{66A7}\x{66A8}\x{66A9}\x{66AA}\x{66AB}' + . '\x{66AE}\x{66AF}\x{66B0}\x{66B1}\x{66B2}\x{66B3}\x{66B4}\x{66B5}\x{66B6}' + . '\x{66B7}\x{66B8}\x{66B9}\x{66BA}\x{66BB}\x{66BC}\x{66BD}\x{66BE}\x{66BF}' + . '\x{66C0}\x{66C1}\x{66C2}\x{66C3}\x{66C4}\x{66C5}\x{66C6}\x{66C7}\x{66C8}' + . '\x{66C9}\x{66CA}\x{66CB}\x{66CC}\x{66CD}\x{66CE}\x{66CF}\x{66D1}\x{66D2}' + . '\x{66D4}\x{66D5}\x{66D6}\x{66D8}\x{66D9}\x{66DA}\x{66DB}\x{66DC}\x{66DD}' + . '\x{66DE}\x{66E0}\x{66E1}\x{66E2}\x{66E3}\x{66E4}\x{66E5}\x{66E6}\x{66E7}' + . '\x{66E8}\x{66E9}\x{66EA}\x{66EB}\x{66EC}\x{66ED}\x{66EE}\x{66F0}\x{66F1}' + . '\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F6}\x{66F7}\x{66F8}\x{66F9}\x{66FA}' + . '\x{66FB}\x{66FC}\x{66FE}\x{66FF}\x{6700}\x{6701}\x{6703}\x{6704}\x{6705}' + . '\x{6706}\x{6708}\x{6709}\x{670A}\x{670B}\x{670C}\x{670D}\x{670E}\x{670F}' + . '\x{6710}\x{6711}\x{6712}\x{6713}\x{6714}\x{6715}\x{6716}\x{6717}\x{6718}' + . '\x{671A}\x{671B}\x{671C}\x{671D}\x{671E}\x{671F}\x{6720}\x{6721}\x{6722}' + . '\x{6723}\x{6725}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}\x{672D}' + . '\x{672E}\x{672F}\x{6730}\x{6731}\x{6732}\x{6733}\x{6734}\x{6735}\x{6736}' + . '\x{6737}\x{6738}\x{6739}\x{673A}\x{673B}\x{673C}\x{673D}\x{673E}\x{673F}' + . '\x{6740}\x{6741}\x{6742}\x{6743}\x{6744}\x{6745}\x{6746}\x{6747}\x{6748}' + . '\x{6749}\x{674A}\x{674B}\x{674C}\x{674D}\x{674E}\x{674F}\x{6750}\x{6751}' + . '\x{6752}\x{6753}\x{6754}\x{6755}\x{6756}\x{6757}\x{6758}\x{6759}\x{675A}' + . '\x{675B}\x{675C}\x{675D}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' + . '\x{6764}\x{6765}\x{6766}\x{6768}\x{6769}\x{676A}\x{676B}\x{676C}\x{676D}' + . '\x{676E}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}\x{6774}\x{6775}\x{6776}' + . '\x{6777}\x{6778}\x{6779}\x{677A}\x{677B}\x{677C}\x{677D}\x{677E}\x{677F}' + . '\x{6780}\x{6781}\x{6782}\x{6783}\x{6784}\x{6785}\x{6786}\x{6787}\x{6789}' + . '\x{678A}\x{678B}\x{678C}\x{678D}\x{678E}\x{678F}\x{6790}\x{6791}\x{6792}' + . '\x{6793}\x{6794}\x{6795}\x{6797}\x{6798}\x{6799}\x{679A}\x{679B}\x{679C}' + . '\x{679D}\x{679E}\x{679F}\x{67A0}\x{67A1}\x{67A2}\x{67A3}\x{67A4}\x{67A5}' + . '\x{67A6}\x{67A7}\x{67A8}\x{67AA}\x{67AB}\x{67AC}\x{67AD}\x{67AE}\x{67AF}' + . '\x{67B0}\x{67B1}\x{67B2}\x{67B3}\x{67B4}\x{67B5}\x{67B6}\x{67B7}\x{67B8}' + . '\x{67B9}\x{67BA}\x{67BB}\x{67BC}\x{67BE}\x{67C0}\x{67C1}\x{67C2}\x{67C3}' + . '\x{67C4}\x{67C5}\x{67C6}\x{67C7}\x{67C8}\x{67C9}\x{67CA}\x{67CB}\x{67CC}' + . '\x{67CD}\x{67CE}\x{67CF}\x{67D0}\x{67D1}\x{67D2}\x{67D3}\x{67D4}\x{67D6}' + . '\x{67D8}\x{67D9}\x{67DA}\x{67DB}\x{67DC}\x{67DD}\x{67DE}\x{67DF}\x{67E0}' + . '\x{67E1}\x{67E2}\x{67E3}\x{67E4}\x{67E5}\x{67E6}\x{67E7}\x{67E8}\x{67E9}' + . '\x{67EA}\x{67EB}\x{67EC}\x{67ED}\x{67EE}\x{67EF}\x{67F0}\x{67F1}\x{67F2}' + . '\x{67F3}\x{67F4}\x{67F5}\x{67F6}\x{67F7}\x{67F8}\x{67FA}\x{67FB}\x{67FC}' + . '\x{67FD}\x{67FE}\x{67FF}\x{6800}\x{6802}\x{6803}\x{6804}\x{6805}\x{6806}' + . '\x{6807}\x{6808}\x{6809}\x{680A}\x{680B}\x{680C}\x{680D}\x{680E}\x{680F}' + . '\x{6810}\x{6811}\x{6812}\x{6813}\x{6814}\x{6816}\x{6817}\x{6818}\x{6819}' + . '\x{681A}\x{681B}\x{681C}\x{681D}\x{681F}\x{6820}\x{6821}\x{6822}\x{6823}' + . '\x{6824}\x{6825}\x{6826}\x{6828}\x{6829}\x{682A}\x{682B}\x{682C}\x{682D}' + . '\x{682E}\x{682F}\x{6831}\x{6832}\x{6833}\x{6834}\x{6835}\x{6836}\x{6837}' + . '\x{6838}\x{6839}\x{683A}\x{683B}\x{683C}\x{683D}\x{683E}\x{683F}\x{6840}' + . '\x{6841}\x{6842}\x{6843}\x{6844}\x{6845}\x{6846}\x{6847}\x{6848}\x{6849}' + . '\x{684A}\x{684B}\x{684C}\x{684D}\x{684E}\x{684F}\x{6850}\x{6851}\x{6852}' + . '\x{6853}\x{6854}\x{6855}\x{6856}\x{6857}\x{685B}\x{685D}\x{6860}\x{6861}' + . '\x{6862}\x{6863}\x{6864}\x{6865}\x{6866}\x{6867}\x{6868}\x{6869}\x{686A}' + . '\x{686B}\x{686C}\x{686D}\x{686E}\x{686F}\x{6870}\x{6871}\x{6872}\x{6873}' + . '\x{6874}\x{6875}\x{6876}\x{6877}\x{6878}\x{6879}\x{687B}\x{687C}\x{687D}' + . '\x{687E}\x{687F}\x{6880}\x{6881}\x{6882}\x{6883}\x{6884}\x{6885}\x{6886}' + . '\x{6887}\x{6888}\x{6889}\x{688A}\x{688B}\x{688C}\x{688D}\x{688E}\x{688F}' + . '\x{6890}\x{6891}\x{6892}\x{6893}\x{6894}\x{6896}\x{6897}\x{6898}\x{689A}' + . '\x{689B}\x{689C}\x{689D}\x{689E}\x{689F}\x{68A0}\x{68A1}\x{68A2}\x{68A3}' + . '\x{68A4}\x{68A6}\x{68A7}\x{68A8}\x{68A9}\x{68AA}\x{68AB}\x{68AC}\x{68AD}' + . '\x{68AE}\x{68AF}\x{68B0}\x{68B1}\x{68B2}\x{68B3}\x{68B4}\x{68B5}\x{68B6}' + . '\x{68B7}\x{68B9}\x{68BB}\x{68BC}\x{68BD}\x{68BE}\x{68BF}\x{68C0}\x{68C1}' + . '\x{68C2}\x{68C4}\x{68C6}\x{68C7}\x{68C8}\x{68C9}\x{68CA}\x{68CB}\x{68CC}' + . '\x{68CD}\x{68CE}\x{68CF}\x{68D0}\x{68D1}\x{68D2}\x{68D3}\x{68D4}\x{68D5}' + . '\x{68D6}\x{68D7}\x{68D8}\x{68DA}\x{68DB}\x{68DC}\x{68DD}\x{68DE}\x{68DF}' + . '\x{68E0}\x{68E1}\x{68E3}\x{68E4}\x{68E6}\x{68E7}\x{68E8}\x{68E9}\x{68EA}' + . '\x{68EB}\x{68EC}\x{68ED}\x{68EE}\x{68EF}\x{68F0}\x{68F1}\x{68F2}\x{68F3}' + . '\x{68F4}\x{68F5}\x{68F6}\x{68F7}\x{68F8}\x{68F9}\x{68FA}\x{68FB}\x{68FC}' + . '\x{68FD}\x{68FE}\x{68FF}\x{6901}\x{6902}\x{6903}\x{6904}\x{6905}\x{6906}' + . '\x{6907}\x{6908}\x{690A}\x{690B}\x{690C}\x{690D}\x{690E}\x{690F}\x{6910}' + . '\x{6911}\x{6912}\x{6913}\x{6914}\x{6915}\x{6916}\x{6917}\x{6918}\x{6919}' + . '\x{691A}\x{691B}\x{691C}\x{691D}\x{691E}\x{691F}\x{6920}\x{6921}\x{6922}' + . '\x{6923}\x{6924}\x{6925}\x{6926}\x{6927}\x{6928}\x{6929}\x{692A}\x{692B}' + . '\x{692C}\x{692D}\x{692E}\x{692F}\x{6930}\x{6931}\x{6932}\x{6933}\x{6934}' + . '\x{6935}\x{6936}\x{6937}\x{6938}\x{6939}\x{693A}\x{693B}\x{693C}\x{693D}' + . '\x{693F}\x{6940}\x{6941}\x{6942}\x{6943}\x{6944}\x{6945}\x{6946}\x{6947}' + . '\x{6948}\x{6949}\x{694A}\x{694B}\x{694C}\x{694E}\x{694F}\x{6950}\x{6951}' + . '\x{6952}\x{6953}\x{6954}\x{6955}\x{6956}\x{6957}\x{6958}\x{6959}\x{695A}' + . '\x{695B}\x{695C}\x{695D}\x{695E}\x{695F}\x{6960}\x{6961}\x{6962}\x{6963}' + . '\x{6964}\x{6965}\x{6966}\x{6967}\x{6968}\x{6969}\x{696A}\x{696B}\x{696C}' + . '\x{696D}\x{696E}\x{696F}\x{6970}\x{6971}\x{6972}\x{6973}\x{6974}\x{6975}' + . '\x{6976}\x{6977}\x{6978}\x{6979}\x{697A}\x{697B}\x{697C}\x{697D}\x{697E}' + . '\x{697F}\x{6980}\x{6981}\x{6982}\x{6983}\x{6984}\x{6985}\x{6986}\x{6987}' + . '\x{6988}\x{6989}\x{698A}\x{698B}\x{698C}\x{698D}\x{698E}\x{698F}\x{6990}' + . '\x{6991}\x{6992}\x{6993}\x{6994}\x{6995}\x{6996}\x{6997}\x{6998}\x{6999}' + . '\x{699A}\x{699B}\x{699C}\x{699D}\x{699E}\x{69A0}\x{69A1}\x{69A3}\x{69A4}' + . '\x{69A5}\x{69A6}\x{69A7}\x{69A8}\x{69A9}\x{69AA}\x{69AB}\x{69AC}\x{69AD}' + . '\x{69AE}\x{69AF}\x{69B0}\x{69B1}\x{69B2}\x{69B3}\x{69B4}\x{69B5}\x{69B6}' + . '\x{69B7}\x{69B8}\x{69B9}\x{69BA}\x{69BB}\x{69BC}\x{69BD}\x{69BE}\x{69BF}' + . '\x{69C1}\x{69C2}\x{69C3}\x{69C4}\x{69C5}\x{69C6}\x{69C7}\x{69C8}\x{69C9}' + . '\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}\x{69CF}\x{69D0}\x{69D3}\x{69D4}' + . '\x{69D8}\x{69D9}\x{69DA}\x{69DB}\x{69DC}\x{69DD}\x{69DE}\x{69DF}\x{69E0}' + . '\x{69E1}\x{69E2}\x{69E3}\x{69E4}\x{69E5}\x{69E6}\x{69E7}\x{69E8}\x{69E9}' + . '\x{69EA}\x{69EB}\x{69EC}\x{69ED}\x{69EE}\x{69EF}\x{69F0}\x{69F1}\x{69F2}' + . '\x{69F3}\x{69F4}\x{69F5}\x{69F6}\x{69F7}\x{69F8}\x{69FA}\x{69FB}\x{69FC}' + . '\x{69FD}\x{69FE}\x{69FF}\x{6A00}\x{6A01}\x{6A02}\x{6A04}\x{6A05}\x{6A06}' + . '\x{6A07}\x{6A08}\x{6A09}\x{6A0A}\x{6A0B}\x{6A0D}\x{6A0E}\x{6A0F}\x{6A10}' + . '\x{6A11}\x{6A12}\x{6A13}\x{6A14}\x{6A15}\x{6A16}\x{6A17}\x{6A18}\x{6A19}' + . '\x{6A1A}\x{6A1B}\x{6A1D}\x{6A1E}\x{6A1F}\x{6A20}\x{6A21}\x{6A22}\x{6A23}' + . '\x{6A25}\x{6A26}\x{6A27}\x{6A28}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2C}\x{6A2D}' + . '\x{6A2E}\x{6A2F}\x{6A30}\x{6A31}\x{6A32}\x{6A33}\x{6A34}\x{6A35}\x{6A36}' + . '\x{6A38}\x{6A39}\x{6A3A}\x{6A3B}\x{6A3C}\x{6A3D}\x{6A3E}\x{6A3F}\x{6A40}' + . '\x{6A41}\x{6A42}\x{6A43}\x{6A44}\x{6A45}\x{6A46}\x{6A47}\x{6A48}\x{6A49}' + . '\x{6A4B}\x{6A4C}\x{6A4D}\x{6A4E}\x{6A4F}\x{6A50}\x{6A51}\x{6A52}\x{6A54}' + . '\x{6A55}\x{6A56}\x{6A57}\x{6A58}\x{6A59}\x{6A5A}\x{6A5B}\x{6A5D}\x{6A5E}' + . '\x{6A5F}\x{6A60}\x{6A61}\x{6A62}\x{6A63}\x{6A64}\x{6A65}\x{6A66}\x{6A67}' + . '\x{6A68}\x{6A69}\x{6A6A}\x{6A6B}\x{6A6C}\x{6A6D}\x{6A6F}\x{6A71}\x{6A72}' + . '\x{6A73}\x{6A74}\x{6A75}\x{6A76}\x{6A77}\x{6A78}\x{6A79}\x{6A7A}\x{6A7B}' + . '\x{6A7C}\x{6A7D}\x{6A7E}\x{6A7F}\x{6A80}\x{6A81}\x{6A82}\x{6A83}\x{6A84}' + . '\x{6A85}\x{6A87}\x{6A88}\x{6A89}\x{6A8B}\x{6A8C}\x{6A8D}\x{6A8E}\x{6A90}' + . '\x{6A91}\x{6A92}\x{6A93}\x{6A94}\x{6A95}\x{6A96}\x{6A97}\x{6A98}\x{6A9A}' + . '\x{6A9B}\x{6A9C}\x{6A9E}\x{6A9F}\x{6AA0}\x{6AA1}\x{6AA2}\x{6AA3}\x{6AA4}' + . '\x{6AA5}\x{6AA6}\x{6AA7}\x{6AA8}\x{6AA9}\x{6AAB}\x{6AAC}\x{6AAD}\x{6AAE}' + . '\x{6AAF}\x{6AB0}\x{6AB2}\x{6AB3}\x{6AB4}\x{6AB5}\x{6AB6}\x{6AB7}\x{6AB8}' + . '\x{6AB9}\x{6ABA}\x{6ABB}\x{6ABC}\x{6ABD}\x{6ABF}\x{6AC1}\x{6AC2}\x{6AC3}' + . '\x{6AC5}\x{6AC6}\x{6AC7}\x{6ACA}\x{6ACB}\x{6ACC}\x{6ACD}\x{6ACE}\x{6ACF}' + . '\x{6AD0}\x{6AD1}\x{6AD2}\x{6AD3}\x{6AD4}\x{6AD5}\x{6AD6}\x{6AD7}\x{6AD9}' + . '\x{6ADA}\x{6ADB}\x{6ADC}\x{6ADD}\x{6ADE}\x{6ADF}\x{6AE0}\x{6AE1}\x{6AE2}' + . '\x{6AE3}\x{6AE4}\x{6AE5}\x{6AE6}\x{6AE7}\x{6AE8}\x{6AEA}\x{6AEB}\x{6AEC}' + . '\x{6AED}\x{6AEE}\x{6AEF}\x{6AF0}\x{6AF1}\x{6AF2}\x{6AF3}\x{6AF4}\x{6AF5}' + . '\x{6AF6}\x{6AF7}\x{6AF8}\x{6AF9}\x{6AFA}\x{6AFB}\x{6AFC}\x{6AFD}\x{6AFE}' + . '\x{6AFF}\x{6B00}\x{6B01}\x{6B02}\x{6B03}\x{6B04}\x{6B05}\x{6B06}\x{6B07}' + . '\x{6B08}\x{6B09}\x{6B0A}\x{6B0B}\x{6B0C}\x{6B0D}\x{6B0F}\x{6B10}\x{6B11}' + . '\x{6B12}\x{6B13}\x{6B14}\x{6B15}\x{6B16}\x{6B17}\x{6B18}\x{6B19}\x{6B1A}' + . '\x{6B1C}\x{6B1D}\x{6B1E}\x{6B1F}\x{6B20}\x{6B21}\x{6B22}\x{6B23}\x{6B24}' + . '\x{6B25}\x{6B26}\x{6B27}\x{6B28}\x{6B29}\x{6B2A}\x{6B2B}\x{6B2C}\x{6B2D}' + . '\x{6B2F}\x{6B30}\x{6B31}\x{6B32}\x{6B33}\x{6B34}\x{6B36}\x{6B37}\x{6B38}' + . '\x{6B39}\x{6B3A}\x{6B3B}\x{6B3C}\x{6B3D}\x{6B3E}\x{6B3F}\x{6B41}\x{6B42}' + . '\x{6B43}\x{6B44}\x{6B45}\x{6B46}\x{6B47}\x{6B48}\x{6B49}\x{6B4A}\x{6B4B}' + . '\x{6B4C}\x{6B4D}\x{6B4E}\x{6B4F}\x{6B50}\x{6B51}\x{6B52}\x{6B53}\x{6B54}' + . '\x{6B55}\x{6B56}\x{6B59}\x{6B5A}\x{6B5B}\x{6B5C}\x{6B5E}\x{6B5F}\x{6B60}' + . '\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B65}\x{6B66}\x{6B67}\x{6B69}\x{6B6A}' + . '\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}\x{6B73}\x{6B74}\x{6B76}\x{6B77}' + . '\x{6B78}\x{6B79}\x{6B7A}\x{6B7B}\x{6B7C}\x{6B7E}\x{6B7F}\x{6B80}\x{6B81}' + . '\x{6B82}\x{6B83}\x{6B84}\x{6B85}\x{6B86}\x{6B87}\x{6B88}\x{6B89}\x{6B8A}' + . '\x{6B8B}\x{6B8C}\x{6B8D}\x{6B8E}\x{6B8F}\x{6B90}\x{6B91}\x{6B92}\x{6B93}' + . '\x{6B94}\x{6B95}\x{6B96}\x{6B97}\x{6B98}\x{6B99}\x{6B9A}\x{6B9B}\x{6B9C}' + . '\x{6B9D}\x{6B9E}\x{6B9F}\x{6BA0}\x{6BA1}\x{6BA2}\x{6BA3}\x{6BA4}\x{6BA5}' + . '\x{6BA6}\x{6BA7}\x{6BA8}\x{6BA9}\x{6BAA}\x{6BAB}\x{6BAC}\x{6BAD}\x{6BAE}' + . '\x{6BAF}\x{6BB0}\x{6BB2}\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB6}\x{6BB7}\x{6BB9}' + . '\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBD}\x{6BBE}\x{6BBF}\x{6BC0}\x{6BC1}\x{6BC2}' + . '\x{6BC3}\x{6BC4}\x{6BC5}\x{6BC6}\x{6BC7}\x{6BC8}\x{6BC9}\x{6BCA}\x{6BCB}' + . '\x{6BCC}\x{6BCD}\x{6BCE}\x{6BCF}\x{6BD0}\x{6BD1}\x{6BD2}\x{6BD3}\x{6BD4}' + . '\x{6BD5}\x{6BD6}\x{6BD7}\x{6BD8}\x{6BD9}\x{6BDA}\x{6BDB}\x{6BDC}\x{6BDD}' + . '\x{6BDE}\x{6BDF}\x{6BE0}\x{6BE1}\x{6BE2}\x{6BE3}\x{6BE4}\x{6BE5}\x{6BE6}' + . '\x{6BE7}\x{6BE8}\x{6BEA}\x{6BEB}\x{6BEC}\x{6BED}\x{6BEE}\x{6BEF}\x{6BF0}' + . '\x{6BF2}\x{6BF3}\x{6BF5}\x{6BF6}\x{6BF7}\x{6BF8}\x{6BF9}\x{6BFB}\x{6BFC}' + . '\x{6BFD}\x{6BFE}\x{6BFF}\x{6C00}\x{6C01}\x{6C02}\x{6C03}\x{6C04}\x{6C05}' + . '\x{6C06}\x{6C07}\x{6C08}\x{6C09}\x{6C0B}\x{6C0C}\x{6C0D}\x{6C0E}\x{6C0F}' + . '\x{6C10}\x{6C11}\x{6C12}\x{6C13}\x{6C14}\x{6C15}\x{6C16}\x{6C18}\x{6C19}' + . '\x{6C1A}\x{6C1B}\x{6C1D}\x{6C1E}\x{6C1F}\x{6C20}\x{6C21}\x{6C22}\x{6C23}' + . '\x{6C24}\x{6C25}\x{6C26}\x{6C27}\x{6C28}\x{6C29}\x{6C2A}\x{6C2B}\x{6C2C}' + . '\x{6C2E}\x{6C2F}\x{6C30}\x{6C31}\x{6C32}\x{6C33}\x{6C34}\x{6C35}\x{6C36}' + . '\x{6C37}\x{6C38}\x{6C3A}\x{6C3B}\x{6C3D}\x{6C3E}\x{6C3F}\x{6C40}\x{6C41}' + . '\x{6C42}\x{6C43}\x{6C44}\x{6C46}\x{6C47}\x{6C48}\x{6C49}\x{6C4A}\x{6C4B}' + . '\x{6C4C}\x{6C4D}\x{6C4E}\x{6C4F}\x{6C50}\x{6C51}\x{6C52}\x{6C53}\x{6C54}' + . '\x{6C55}\x{6C56}\x{6C57}\x{6C58}\x{6C59}\x{6C5A}\x{6C5B}\x{6C5C}\x{6C5D}' + . '\x{6C5E}\x{6C5F}\x{6C60}\x{6C61}\x{6C62}\x{6C63}\x{6C64}\x{6C65}\x{6C66}' + . '\x{6C67}\x{6C68}\x{6C69}\x{6C6A}\x{6C6B}\x{6C6D}\x{6C6F}\x{6C70}\x{6C71}' + . '\x{6C72}\x{6C73}\x{6C74}\x{6C75}\x{6C76}\x{6C77}\x{6C78}\x{6C79}\x{6C7A}' + . '\x{6C7B}\x{6C7C}\x{6C7D}\x{6C7E}\x{6C7F}\x{6C80}\x{6C81}\x{6C82}\x{6C83}' + . '\x{6C84}\x{6C85}\x{6C86}\x{6C87}\x{6C88}\x{6C89}\x{6C8A}\x{6C8B}\x{6C8C}' + . '\x{6C8D}\x{6C8E}\x{6C8F}\x{6C90}\x{6C91}\x{6C92}\x{6C93}\x{6C94}\x{6C95}' + . '\x{6C96}\x{6C97}\x{6C98}\x{6C99}\x{6C9A}\x{6C9B}\x{6C9C}\x{6C9D}\x{6C9E}' + . '\x{6C9F}\x{6CA1}\x{6CA2}\x{6CA3}\x{6CA4}\x{6CA5}\x{6CA6}\x{6CA7}\x{6CA8}' + . '\x{6CA9}\x{6CAA}\x{6CAB}\x{6CAC}\x{6CAD}\x{6CAE}\x{6CAF}\x{6CB0}\x{6CB1}' + . '\x{6CB2}\x{6CB3}\x{6CB4}\x{6CB5}\x{6CB6}\x{6CB7}\x{6CB8}\x{6CB9}\x{6CBA}' + . '\x{6CBB}\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC0}\x{6CC1}\x{6CC2}\x{6CC3}' + . '\x{6CC4}\x{6CC5}\x{6CC6}\x{6CC7}\x{6CC8}\x{6CC9}\x{6CCA}\x{6CCB}\x{6CCC}' + . '\x{6CCD}\x{6CCE}\x{6CCF}\x{6CD0}\x{6CD1}\x{6CD2}\x{6CD3}\x{6CD4}\x{6CD5}' + . '\x{6CD6}\x{6CD7}\x{6CD9}\x{6CDA}\x{6CDB}\x{6CDC}\x{6CDD}\x{6CDE}\x{6CDF}' + . '\x{6CE0}\x{6CE1}\x{6CE2}\x{6CE3}\x{6CE4}\x{6CE5}\x{6CE6}\x{6CE7}\x{6CE8}' + . '\x{6CE9}\x{6CEA}\x{6CEB}\x{6CEC}\x{6CED}\x{6CEE}\x{6CEF}\x{6CF0}\x{6CF1}' + . '\x{6CF2}\x{6CF3}\x{6CF5}\x{6CF6}\x{6CF7}\x{6CF8}\x{6CF9}\x{6CFA}\x{6CFB}' + . '\x{6CFC}\x{6CFD}\x{6CFE}\x{6CFF}\x{6D00}\x{6D01}\x{6D03}\x{6D04}\x{6D05}' + . '\x{6D06}\x{6D07}\x{6D08}\x{6D09}\x{6D0A}\x{6D0B}\x{6D0C}\x{6D0D}\x{6D0E}' + . '\x{6D0F}\x{6D10}\x{6D11}\x{6D12}\x{6D13}\x{6D14}\x{6D15}\x{6D16}\x{6D17}' + . '\x{6D18}\x{6D19}\x{6D1A}\x{6D1B}\x{6D1D}\x{6D1E}\x{6D1F}\x{6D20}\x{6D21}' + . '\x{6D22}\x{6D23}\x{6D25}\x{6D26}\x{6D27}\x{6D28}\x{6D29}\x{6D2A}\x{6D2B}' + . '\x{6D2C}\x{6D2D}\x{6D2E}\x{6D2F}\x{6D30}\x{6D31}\x{6D32}\x{6D33}\x{6D34}' + . '\x{6D35}\x{6D36}\x{6D37}\x{6D38}\x{6D39}\x{6D3A}\x{6D3B}\x{6D3C}\x{6D3D}' + . '\x{6D3E}\x{6D3F}\x{6D40}\x{6D41}\x{6D42}\x{6D43}\x{6D44}\x{6D45}\x{6D46}' + . '\x{6D47}\x{6D48}\x{6D49}\x{6D4A}\x{6D4B}\x{6D4C}\x{6D4D}\x{6D4E}\x{6D4F}' + . '\x{6D50}\x{6D51}\x{6D52}\x{6D53}\x{6D54}\x{6D55}\x{6D56}\x{6D57}\x{6D58}' + . '\x{6D59}\x{6D5A}\x{6D5B}\x{6D5C}\x{6D5D}\x{6D5E}\x{6D5F}\x{6D60}\x{6D61}' + . '\x{6D62}\x{6D63}\x{6D64}\x{6D65}\x{6D66}\x{6D67}\x{6D68}\x{6D69}\x{6D6A}' + . '\x{6D6B}\x{6D6C}\x{6D6D}\x{6D6E}\x{6D6F}\x{6D70}\x{6D72}\x{6D73}\x{6D74}' + . '\x{6D75}\x{6D76}\x{6D77}\x{6D78}\x{6D79}\x{6D7A}\x{6D7B}\x{6D7C}\x{6D7D}' + . '\x{6D7E}\x{6D7F}\x{6D80}\x{6D82}\x{6D83}\x{6D84}\x{6D85}\x{6D86}\x{6D87}' + . '\x{6D88}\x{6D89}\x{6D8A}\x{6D8B}\x{6D8C}\x{6D8D}\x{6D8E}\x{6D8F}\x{6D90}' + . '\x{6D91}\x{6D92}\x{6D93}\x{6D94}\x{6D95}\x{6D97}\x{6D98}\x{6D99}\x{6D9A}' + . '\x{6D9B}\x{6D9D}\x{6D9E}\x{6D9F}\x{6DA0}\x{6DA1}\x{6DA2}\x{6DA3}\x{6DA4}' + . '\x{6DA5}\x{6DA6}\x{6DA7}\x{6DA8}\x{6DA9}\x{6DAA}\x{6DAB}\x{6DAC}\x{6DAD}' + . '\x{6DAE}\x{6DAF}\x{6DB2}\x{6DB3}\x{6DB4}\x{6DB5}\x{6DB7}\x{6DB8}\x{6DB9}' + . '\x{6DBA}\x{6DBB}\x{6DBC}\x{6DBD}\x{6DBE}\x{6DBF}\x{6DC0}\x{6DC1}\x{6DC2}' + . '\x{6DC3}\x{6DC4}\x{6DC5}\x{6DC6}\x{6DC7}\x{6DC8}\x{6DC9}\x{6DCA}\x{6DCB}' + . '\x{6DCC}\x{6DCD}\x{6DCE}\x{6DCF}\x{6DD0}\x{6DD1}\x{6DD2}\x{6DD3}\x{6DD4}' + . '\x{6DD5}\x{6DD6}\x{6DD7}\x{6DD8}\x{6DD9}\x{6DDA}\x{6DDB}\x{6DDC}\x{6DDD}' + . '\x{6DDE}\x{6DDF}\x{6DE0}\x{6DE1}\x{6DE2}\x{6DE3}\x{6DE4}\x{6DE5}\x{6DE6}' + . '\x{6DE7}\x{6DE8}\x{6DE9}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DED}\x{6DEE}\x{6DEF}' + . '\x{6DF0}\x{6DF1}\x{6DF2}\x{6DF3}\x{6DF4}\x{6DF5}\x{6DF6}\x{6DF7}\x{6DF8}' + . '\x{6DF9}\x{6DFA}\x{6DFB}\x{6DFC}\x{6DFD}\x{6E00}\x{6E03}\x{6E04}\x{6E05}' + . '\x{6E07}\x{6E08}\x{6E09}\x{6E0A}\x{6E0B}\x{6E0C}\x{6E0D}\x{6E0E}\x{6E0F}' + . '\x{6E10}\x{6E11}\x{6E14}\x{6E15}\x{6E16}\x{6E17}\x{6E19}\x{6E1A}\x{6E1B}' + . '\x{6E1C}\x{6E1D}\x{6E1E}\x{6E1F}\x{6E20}\x{6E21}\x{6E22}\x{6E23}\x{6E24}' + . '\x{6E25}\x{6E26}\x{6E27}\x{6E28}\x{6E29}\x{6E2B}\x{6E2C}\x{6E2D}\x{6E2E}' + . '\x{6E2F}\x{6E30}\x{6E31}\x{6E32}\x{6E33}\x{6E34}\x{6E35}\x{6E36}\x{6E37}' + . '\x{6E38}\x{6E39}\x{6E3A}\x{6E3B}\x{6E3C}\x{6E3D}\x{6E3E}\x{6E3F}\x{6E40}' + . '\x{6E41}\x{6E42}\x{6E43}\x{6E44}\x{6E45}\x{6E46}\x{6E47}\x{6E48}\x{6E49}' + . '\x{6E4A}\x{6E4B}\x{6E4D}\x{6E4E}\x{6E4F}\x{6E50}\x{6E51}\x{6E52}\x{6E53}' + . '\x{6E54}\x{6E55}\x{6E56}\x{6E57}\x{6E58}\x{6E59}\x{6E5A}\x{6E5B}\x{6E5C}' + . '\x{6E5D}\x{6E5E}\x{6E5F}\x{6E60}\x{6E61}\x{6E62}\x{6E63}\x{6E64}\x{6E65}' + . '\x{6E66}\x{6E67}\x{6E68}\x{6E69}\x{6E6A}\x{6E6B}\x{6E6D}\x{6E6E}\x{6E6F}' + . '\x{6E70}\x{6E71}\x{6E72}\x{6E73}\x{6E74}\x{6E75}\x{6E77}\x{6E78}\x{6E79}' + . '\x{6E7E}\x{6E7F}\x{6E80}\x{6E81}\x{6E82}\x{6E83}\x{6E84}\x{6E85}\x{6E86}' + . '\x{6E87}\x{6E88}\x{6E89}\x{6E8A}\x{6E8D}\x{6E8E}\x{6E8F}\x{6E90}\x{6E91}' + . '\x{6E92}\x{6E93}\x{6E94}\x{6E96}\x{6E97}\x{6E98}\x{6E99}\x{6E9A}\x{6E9B}' + . '\x{6E9C}\x{6E9D}\x{6E9E}\x{6E9F}\x{6EA0}\x{6EA1}\x{6EA2}\x{6EA3}\x{6EA4}' + . '\x{6EA5}\x{6EA6}\x{6EA7}\x{6EA8}\x{6EA9}\x{6EAA}\x{6EAB}\x{6EAC}\x{6EAD}' + . '\x{6EAE}\x{6EAF}\x{6EB0}\x{6EB1}\x{6EB2}\x{6EB3}\x{6EB4}\x{6EB5}\x{6EB6}' + . '\x{6EB7}\x{6EB8}\x{6EB9}\x{6EBA}\x{6EBB}\x{6EBC}\x{6EBD}\x{6EBE}\x{6EBF}' + . '\x{6EC0}\x{6EC1}\x{6EC2}\x{6EC3}\x{6EC4}\x{6EC5}\x{6EC6}\x{6EC7}\x{6EC8}' + . '\x{6EC9}\x{6ECA}\x{6ECB}\x{6ECC}\x{6ECD}\x{6ECE}\x{6ECF}\x{6ED0}\x{6ED1}' + . '\x{6ED2}\x{6ED3}\x{6ED4}\x{6ED5}\x{6ED6}\x{6ED7}\x{6ED8}\x{6ED9}\x{6EDA}' + . '\x{6EDC}\x{6EDE}\x{6EDF}\x{6EE0}\x{6EE1}\x{6EE2}\x{6EE4}\x{6EE5}\x{6EE6}' + . '\x{6EE7}\x{6EE8}\x{6EE9}\x{6EEA}\x{6EEB}\x{6EEC}\x{6EED}\x{6EEE}\x{6EEF}' + . '\x{6EF0}\x{6EF1}\x{6EF2}\x{6EF3}\x{6EF4}\x{6EF5}\x{6EF6}\x{6EF7}\x{6EF8}' + . '\x{6EF9}\x{6EFA}\x{6EFB}\x{6EFC}\x{6EFD}\x{6EFE}\x{6EFF}\x{6F00}\x{6F01}' + . '\x{6F02}\x{6F03}\x{6F05}\x{6F06}\x{6F07}\x{6F08}\x{6F09}\x{6F0A}\x{6F0C}' + . '\x{6F0D}\x{6F0E}\x{6F0F}\x{6F10}\x{6F11}\x{6F12}\x{6F13}\x{6F14}\x{6F15}' + . '\x{6F16}\x{6F17}\x{6F18}\x{6F19}\x{6F1A}\x{6F1B}\x{6F1C}\x{6F1D}\x{6F1E}' + . '\x{6F1F}\x{6F20}\x{6F21}\x{6F22}\x{6F23}\x{6F24}\x{6F25}\x{6F26}\x{6F27}' + . '\x{6F28}\x{6F29}\x{6F2A}\x{6F2B}\x{6F2C}\x{6F2D}\x{6F2E}\x{6F2F}\x{6F30}' + . '\x{6F31}\x{6F32}\x{6F33}\x{6F34}\x{6F35}\x{6F36}\x{6F37}\x{6F38}\x{6F39}' + . '\x{6F3A}\x{6F3B}\x{6F3C}\x{6F3D}\x{6F3E}\x{6F3F}\x{6F40}\x{6F41}\x{6F43}' + . '\x{6F44}\x{6F45}\x{6F46}\x{6F47}\x{6F49}\x{6F4B}\x{6F4C}\x{6F4D}\x{6F4E}' + . '\x{6F4F}\x{6F50}\x{6F51}\x{6F52}\x{6F53}\x{6F54}\x{6F55}\x{6F56}\x{6F57}' + . '\x{6F58}\x{6F59}\x{6F5A}\x{6F5B}\x{6F5C}\x{6F5D}\x{6F5E}\x{6F5F}\x{6F60}' + . '\x{6F61}\x{6F62}\x{6F63}\x{6F64}\x{6F65}\x{6F66}\x{6F67}\x{6F68}\x{6F69}' + . '\x{6F6A}\x{6F6B}\x{6F6C}\x{6F6D}\x{6F6E}\x{6F6F}\x{6F70}\x{6F71}\x{6F72}' + . '\x{6F73}\x{6F74}\x{6F75}\x{6F76}\x{6F77}\x{6F78}\x{6F7A}\x{6F7B}\x{6F7C}' + . '\x{6F7D}\x{6F7E}\x{6F7F}\x{6F80}\x{6F81}\x{6F82}\x{6F83}\x{6F84}\x{6F85}' + . '\x{6F86}\x{6F87}\x{6F88}\x{6F89}\x{6F8A}\x{6F8B}\x{6F8C}\x{6F8D}\x{6F8E}' + . '\x{6F8F}\x{6F90}\x{6F91}\x{6F92}\x{6F93}\x{6F94}\x{6F95}\x{6F96}\x{6F97}' + . '\x{6F99}\x{6F9B}\x{6F9C}\x{6F9D}\x{6F9E}\x{6FA0}\x{6FA1}\x{6FA2}\x{6FA3}' + . '\x{6FA4}\x{6FA5}\x{6FA6}\x{6FA7}\x{6FA8}\x{6FA9}\x{6FAA}\x{6FAB}\x{6FAC}' + . '\x{6FAD}\x{6FAE}\x{6FAF}\x{6FB0}\x{6FB1}\x{6FB2}\x{6FB3}\x{6FB4}\x{6FB5}' + . '\x{6FB6}\x{6FB8}\x{6FB9}\x{6FBA}\x{6FBB}\x{6FBC}\x{6FBD}\x{6FBE}\x{6FBF}' + . '\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC4}\x{6FC6}\x{6FC7}\x{6FC8}\x{6FC9}' + . '\x{6FCA}\x{6FCB}\x{6FCC}\x{6FCD}\x{6FCE}\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}' + . '\x{6FD5}\x{6FD6}\x{6FD7}\x{6FD8}\x{6FD9}\x{6FDA}\x{6FDB}\x{6FDC}\x{6FDD}' + . '\x{6FDE}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE2}\x{6FE3}\x{6FE4}\x{6FE5}\x{6FE6}' + . '\x{6FE7}\x{6FE8}\x{6FE9}\x{6FEA}\x{6FEB}\x{6FEC}\x{6FED}\x{6FEE}\x{6FEF}' + . '\x{6FF0}\x{6FF1}\x{6FF2}\x{6FF3}\x{6FF4}\x{6FF6}\x{6FF7}\x{6FF8}\x{6FF9}' + . '\x{6FFA}\x{6FFB}\x{6FFC}\x{6FFE}\x{6FFF}\x{7000}\x{7001}\x{7002}\x{7003}' + . '\x{7004}\x{7005}\x{7006}\x{7007}\x{7008}\x{7009}\x{700A}\x{700B}\x{700C}' + . '\x{700D}\x{700E}\x{700F}\x{7011}\x{7012}\x{7014}\x{7015}\x{7016}\x{7017}' + . '\x{7018}\x{7019}\x{701A}\x{701B}\x{701C}\x{701D}\x{701F}\x{7020}\x{7021}' + . '\x{7022}\x{7023}\x{7024}\x{7025}\x{7026}\x{7027}\x{7028}\x{7029}\x{702A}' + . '\x{702B}\x{702C}\x{702D}\x{702E}\x{702F}\x{7030}\x{7031}\x{7032}\x{7033}' + . '\x{7034}\x{7035}\x{7036}\x{7037}\x{7038}\x{7039}\x{703A}\x{703B}\x{703C}' + . '\x{703D}\x{703E}\x{703F}\x{7040}\x{7041}\x{7042}\x{7043}\x{7044}\x{7045}' + . '\x{7046}\x{7048}\x{7049}\x{704A}\x{704C}\x{704D}\x{704F}\x{7050}\x{7051}' + . '\x{7052}\x{7053}\x{7054}\x{7055}\x{7056}\x{7057}\x{7058}\x{7059}\x{705A}' + . '\x{705B}\x{705C}\x{705D}\x{705E}\x{705F}\x{7060}\x{7061}\x{7062}\x{7063}' + . '\x{7064}\x{7065}\x{7066}\x{7067}\x{7068}\x{7069}\x{706A}\x{706B}\x{706C}' + . '\x{706D}\x{706E}\x{706F}\x{7070}\x{7071}\x{7074}\x{7075}\x{7076}\x{7077}' + . '\x{7078}\x{7079}\x{707A}\x{707C}\x{707D}\x{707E}\x{707F}\x{7080}\x{7082}' + . '\x{7083}\x{7084}\x{7085}\x{7086}\x{7087}\x{7088}\x{7089}\x{708A}\x{708B}' + . '\x{708C}\x{708E}\x{708F}\x{7090}\x{7091}\x{7092}\x{7093}\x{7094}\x{7095}' + . '\x{7096}\x{7098}\x{7099}\x{709A}\x{709C}\x{709D}\x{709E}\x{709F}\x{70A0}' + . '\x{70A1}\x{70A2}\x{70A3}\x{70A4}\x{70A5}\x{70A6}\x{70A7}\x{70A8}\x{70A9}' + . '\x{70AB}\x{70AC}\x{70AD}\x{70AE}\x{70AF}\x{70B0}\x{70B1}\x{70B3}\x{70B4}' + . '\x{70B5}\x{70B7}\x{70B8}\x{70B9}\x{70BA}\x{70BB}\x{70BC}\x{70BD}\x{70BE}' + . '\x{70BF}\x{70C0}\x{70C1}\x{70C2}\x{70C3}\x{70C4}\x{70C5}\x{70C6}\x{70C7}' + . '\x{70C8}\x{70C9}\x{70CA}\x{70CB}\x{70CC}\x{70CD}\x{70CE}\x{70CF}\x{70D0}' + . '\x{70D1}\x{70D2}\x{70D3}\x{70D4}\x{70D6}\x{70D7}\x{70D8}\x{70D9}\x{70DA}' + . '\x{70DB}\x{70DC}\x{70DD}\x{70DE}\x{70DF}\x{70E0}\x{70E1}\x{70E2}\x{70E3}' + . '\x{70E4}\x{70E5}\x{70E6}\x{70E7}\x{70E8}\x{70E9}\x{70EA}\x{70EB}\x{70EC}' + . '\x{70ED}\x{70EE}\x{70EF}\x{70F0}\x{70F1}\x{70F2}\x{70F3}\x{70F4}\x{70F5}' + . '\x{70F6}\x{70F7}\x{70F8}\x{70F9}\x{70FA}\x{70FB}\x{70FC}\x{70FD}\x{70FF}' + . '\x{7100}\x{7101}\x{7102}\x{7103}\x{7104}\x{7105}\x{7106}\x{7107}\x{7109}' + . '\x{710A}\x{710B}\x{710C}\x{710D}\x{710E}\x{710F}\x{7110}\x{7111}\x{7112}' + . '\x{7113}\x{7115}\x{7116}\x{7117}\x{7118}\x{7119}\x{711A}\x{711B}\x{711C}' + . '\x{711D}\x{711E}\x{711F}\x{7120}\x{7121}\x{7122}\x{7123}\x{7125}\x{7126}' + . '\x{7127}\x{7128}\x{7129}\x{712A}\x{712B}\x{712C}\x{712D}\x{712E}\x{712F}' + . '\x{7130}\x{7131}\x{7132}\x{7135}\x{7136}\x{7137}\x{7138}\x{7139}\x{713A}' + . '\x{713B}\x{713D}\x{713E}\x{713F}\x{7140}\x{7141}\x{7142}\x{7143}\x{7144}' + . '\x{7145}\x{7146}\x{7147}\x{7148}\x{7149}\x{714A}\x{714B}\x{714C}\x{714D}' + . '\x{714E}\x{714F}\x{7150}\x{7151}\x{7152}\x{7153}\x{7154}\x{7156}\x{7158}' + . '\x{7159}\x{715A}\x{715B}\x{715C}\x{715D}\x{715E}\x{715F}\x{7160}\x{7161}' + . '\x{7162}\x{7163}\x{7164}\x{7165}\x{7166}\x{7167}\x{7168}\x{7169}\x{716A}' + . '\x{716C}\x{716E}\x{716F}\x{7170}\x{7171}\x{7172}\x{7173}\x{7174}\x{7175}' + . '\x{7176}\x{7177}\x{7178}\x{7179}\x{717A}\x{717B}\x{717C}\x{717D}\x{717E}' + . '\x{717F}\x{7180}\x{7181}\x{7182}\x{7183}\x{7184}\x{7185}\x{7186}\x{7187}' + . '\x{7188}\x{7189}\x{718A}\x{718B}\x{718C}\x{718E}\x{718F}\x{7190}\x{7191}' + . '\x{7192}\x{7193}\x{7194}\x{7195}\x{7197}\x{7198}\x{7199}\x{719A}\x{719B}' + . '\x{719C}\x{719D}\x{719E}\x{719F}\x{71A0}\x{71A1}\x{71A2}\x{71A3}\x{71A4}' + . '\x{71A5}\x{71A7}\x{71A8}\x{71A9}\x{71AA}\x{71AC}\x{71AD}\x{71AE}\x{71AF}' + . '\x{71B0}\x{71B1}\x{71B2}\x{71B3}\x{71B4}\x{71B5}\x{71B7}\x{71B8}\x{71B9}' + . '\x{71BA}\x{71BB}\x{71BC}\x{71BD}\x{71BE}\x{71BF}\x{71C0}\x{71C1}\x{71C2}' + . '\x{71C3}\x{71C4}\x{71C5}\x{71C6}\x{71C7}\x{71C8}\x{71C9}\x{71CA}\x{71CB}' + . '\x{71CD}\x{71CE}\x{71CF}\x{71D0}\x{71D1}\x{71D2}\x{71D4}\x{71D5}\x{71D6}' + . '\x{71D7}\x{71D8}\x{71D9}\x{71DA}\x{71DB}\x{71DC}\x{71DD}\x{71DE}\x{71DF}' + . '\x{71E0}\x{71E1}\x{71E2}\x{71E3}\x{71E4}\x{71E5}\x{71E6}\x{71E7}\x{71E8}' + . '\x{71E9}\x{71EA}\x{71EB}\x{71EC}\x{71ED}\x{71EE}\x{71EF}\x{71F0}\x{71F1}' + . '\x{71F2}\x{71F4}\x{71F5}\x{71F6}\x{71F7}\x{71F8}\x{71F9}\x{71FB}\x{71FC}' + . '\x{71FD}\x{71FE}\x{71FF}\x{7201}\x{7202}\x{7203}\x{7204}\x{7205}\x{7206}' + . '\x{7207}\x{7208}\x{7209}\x{720A}\x{720C}\x{720D}\x{720E}\x{720F}\x{7210}' + . '\x{7212}\x{7213}\x{7214}\x{7216}\x{7218}\x{7219}\x{721A}\x{721B}\x{721C}' + . '\x{721D}\x{721E}\x{721F}\x{7221}\x{7222}\x{7223}\x{7226}\x{7227}\x{7228}' + . '\x{7229}\x{722A}\x{722B}\x{722C}\x{722D}\x{722E}\x{7230}\x{7231}\x{7232}' + . '\x{7233}\x{7235}\x{7236}\x{7237}\x{7238}\x{7239}\x{723A}\x{723B}\x{723C}' + . '\x{723D}\x{723E}\x{723F}\x{7240}\x{7241}\x{7242}\x{7243}\x{7244}\x{7246}' + . '\x{7247}\x{7248}\x{7249}\x{724A}\x{724B}\x{724C}\x{724D}\x{724F}\x{7251}' + . '\x{7252}\x{7253}\x{7254}\x{7256}\x{7257}\x{7258}\x{7259}\x{725A}\x{725B}' + . '\x{725C}\x{725D}\x{725E}\x{725F}\x{7260}\x{7261}\x{7262}\x{7263}\x{7264}' + . '\x{7265}\x{7266}\x{7267}\x{7268}\x{7269}\x{726A}\x{726B}\x{726C}\x{726D}' + . '\x{726E}\x{726F}\x{7270}\x{7271}\x{7272}\x{7273}\x{7274}\x{7275}\x{7276}' + . '\x{7277}\x{7278}\x{7279}\x{727A}\x{727B}\x{727C}\x{727D}\x{727E}\x{727F}' + . '\x{7280}\x{7281}\x{7282}\x{7283}\x{7284}\x{7285}\x{7286}\x{7287}\x{7288}' + . '\x{7289}\x{728A}\x{728B}\x{728C}\x{728D}\x{728E}\x{728F}\x{7290}\x{7291}' + . '\x{7292}\x{7293}\x{7294}\x{7295}\x{7296}\x{7297}\x{7298}\x{7299}\x{729A}' + . '\x{729B}\x{729C}\x{729D}\x{729E}\x{729F}\x{72A1}\x{72A2}\x{72A3}\x{72A4}' + . '\x{72A5}\x{72A6}\x{72A7}\x{72A8}\x{72A9}\x{72AA}\x{72AC}\x{72AD}\x{72AE}' + . '\x{72AF}\x{72B0}\x{72B1}\x{72B2}\x{72B3}\x{72B4}\x{72B5}\x{72B6}\x{72B7}' + . '\x{72B8}\x{72B9}\x{72BA}\x{72BB}\x{72BC}\x{72BD}\x{72BF}\x{72C0}\x{72C1}' + . '\x{72C2}\x{72C3}\x{72C4}\x{72C5}\x{72C6}\x{72C7}\x{72C8}\x{72C9}\x{72CA}' + . '\x{72CB}\x{72CC}\x{72CD}\x{72CE}\x{72CF}\x{72D0}\x{72D1}\x{72D2}\x{72D3}' + . '\x{72D4}\x{72D5}\x{72D6}\x{72D7}\x{72D8}\x{72D9}\x{72DA}\x{72DB}\x{72DC}' + . '\x{72DD}\x{72DE}\x{72DF}\x{72E0}\x{72E1}\x{72E2}\x{72E3}\x{72E4}\x{72E5}' + . '\x{72E6}\x{72E7}\x{72E8}\x{72E9}\x{72EA}\x{72EB}\x{72EC}\x{72ED}\x{72EE}' + . '\x{72EF}\x{72F0}\x{72F1}\x{72F2}\x{72F3}\x{72F4}\x{72F5}\x{72F6}\x{72F7}' + . '\x{72F8}\x{72F9}\x{72FA}\x{72FB}\x{72FC}\x{72FD}\x{72FE}\x{72FF}\x{7300}' + . '\x{7301}\x{7303}\x{7304}\x{7305}\x{7306}\x{7307}\x{7308}\x{7309}\x{730A}' + . '\x{730B}\x{730C}\x{730D}\x{730E}\x{730F}\x{7311}\x{7312}\x{7313}\x{7314}' + . '\x{7315}\x{7316}\x{7317}\x{7318}\x{7319}\x{731A}\x{731B}\x{731C}\x{731D}' + . '\x{731E}\x{7320}\x{7321}\x{7322}\x{7323}\x{7324}\x{7325}\x{7326}\x{7327}' + . '\x{7329}\x{732A}\x{732B}\x{732C}\x{732D}\x{732E}\x{7330}\x{7331}\x{7332}' + . '\x{7333}\x{7334}\x{7335}\x{7336}\x{7337}\x{7338}\x{7339}\x{733A}\x{733B}' + . '\x{733C}\x{733D}\x{733E}\x{733F}\x{7340}\x{7341}\x{7342}\x{7343}\x{7344}' + . '\x{7345}\x{7346}\x{7347}\x{7348}\x{7349}\x{734A}\x{734B}\x{734C}\x{734D}' + . '\x{734E}\x{7350}\x{7351}\x{7352}\x{7354}\x{7355}\x{7356}\x{7357}\x{7358}' + . '\x{7359}\x{735A}\x{735B}\x{735C}\x{735D}\x{735E}\x{735F}\x{7360}\x{7361}' + . '\x{7362}\x{7364}\x{7365}\x{7366}\x{7367}\x{7368}\x{7369}\x{736A}\x{736B}' + . '\x{736C}\x{736D}\x{736E}\x{736F}\x{7370}\x{7371}\x{7372}\x{7373}\x{7374}' + . '\x{7375}\x{7376}\x{7377}\x{7378}\x{7379}\x{737A}\x{737B}\x{737C}\x{737D}' + . '\x{737E}\x{737F}\x{7380}\x{7381}\x{7382}\x{7383}\x{7384}\x{7385}\x{7386}' + . '\x{7387}\x{7388}\x{7389}\x{738A}\x{738B}\x{738C}\x{738D}\x{738E}\x{738F}' + . '\x{7390}\x{7391}\x{7392}\x{7393}\x{7394}\x{7395}\x{7396}\x{7397}\x{7398}' + . '\x{7399}\x{739A}\x{739B}\x{739D}\x{739E}\x{739F}\x{73A0}\x{73A1}\x{73A2}' + . '\x{73A3}\x{73A4}\x{73A5}\x{73A6}\x{73A7}\x{73A8}\x{73A9}\x{73AA}\x{73AB}' + . '\x{73AC}\x{73AD}\x{73AE}\x{73AF}\x{73B0}\x{73B1}\x{73B2}\x{73B3}\x{73B4}' + . '\x{73B5}\x{73B6}\x{73B7}\x{73B8}\x{73B9}\x{73BA}\x{73BB}\x{73BC}\x{73BD}' + . '\x{73BE}\x{73BF}\x{73C0}\x{73C2}\x{73C3}\x{73C4}\x{73C5}\x{73C6}\x{73C7}' + . '\x{73C8}\x{73C9}\x{73CA}\x{73CB}\x{73CC}\x{73CD}\x{73CE}\x{73CF}\x{73D0}' + . '\x{73D1}\x{73D2}\x{73D3}\x{73D4}\x{73D5}\x{73D6}\x{73D7}\x{73D8}\x{73D9}' + . '\x{73DA}\x{73DB}\x{73DC}\x{73DD}\x{73DE}\x{73DF}\x{73E0}\x{73E2}\x{73E3}' + . '\x{73E5}\x{73E6}\x{73E7}\x{73E8}\x{73E9}\x{73EA}\x{73EB}\x{73EC}\x{73ED}' + . '\x{73EE}\x{73EF}\x{73F0}\x{73F1}\x{73F2}\x{73F4}\x{73F5}\x{73F6}\x{73F7}' + . '\x{73F8}\x{73F9}\x{73FA}\x{73FC}\x{73FD}\x{73FE}\x{73FF}\x{7400}\x{7401}' + . '\x{7402}\x{7403}\x{7404}\x{7405}\x{7406}\x{7407}\x{7408}\x{7409}\x{740A}' + . '\x{740B}\x{740C}\x{740D}\x{740E}\x{740F}\x{7410}\x{7411}\x{7412}\x{7413}' + . '\x{7414}\x{7415}\x{7416}\x{7417}\x{7419}\x{741A}\x{741B}\x{741C}\x{741D}' + . '\x{741E}\x{741F}\x{7420}\x{7421}\x{7422}\x{7423}\x{7424}\x{7425}\x{7426}' + . '\x{7427}\x{7428}\x{7429}\x{742A}\x{742B}\x{742C}\x{742D}\x{742E}\x{742F}' + . '\x{7430}\x{7431}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{7437}\x{7438}' + . '\x{743A}\x{743B}\x{743C}\x{743D}\x{743F}\x{7440}\x{7441}\x{7442}\x{7443}' + . '\x{7444}\x{7445}\x{7446}\x{7448}\x{744A}\x{744B}\x{744C}\x{744D}\x{744E}' + . '\x{744F}\x{7450}\x{7451}\x{7452}\x{7453}\x{7454}\x{7455}\x{7456}\x{7457}' + . '\x{7459}\x{745A}\x{745B}\x{745C}\x{745D}\x{745E}\x{745F}\x{7461}\x{7462}' + . '\x{7463}\x{7464}\x{7465}\x{7466}\x{7467}\x{7468}\x{7469}\x{746A}\x{746B}' + . '\x{746C}\x{746D}\x{746E}\x{746F}\x{7470}\x{7471}\x{7472}\x{7473}\x{7474}' + . '\x{7475}\x{7476}\x{7477}\x{7478}\x{7479}\x{747A}\x{747C}\x{747D}\x{747E}' + . '\x{747F}\x{7480}\x{7481}\x{7482}\x{7483}\x{7485}\x{7486}\x{7487}\x{7488}' + . '\x{7489}\x{748A}\x{748B}\x{748C}\x{748D}\x{748E}\x{748F}\x{7490}\x{7491}' + . '\x{7492}\x{7493}\x{7494}\x{7495}\x{7497}\x{7498}\x{7499}\x{749A}\x{749B}' + . '\x{749C}\x{749E}\x{749F}\x{74A0}\x{74A1}\x{74A3}\x{74A4}\x{74A5}\x{74A6}' + . '\x{74A7}\x{74A8}\x{74A9}\x{74AA}\x{74AB}\x{74AC}\x{74AD}\x{74AE}\x{74AF}' + . '\x{74B0}\x{74B1}\x{74B2}\x{74B3}\x{74B4}\x{74B5}\x{74B6}\x{74B7}\x{74B8}' + . '\x{74B9}\x{74BA}\x{74BB}\x{74BC}\x{74BD}\x{74BE}\x{74BF}\x{74C0}\x{74C1}' + . '\x{74C2}\x{74C3}\x{74C4}\x{74C5}\x{74C6}\x{74CA}\x{74CB}\x{74CD}\x{74CE}' + . '\x{74CF}\x{74D0}\x{74D1}\x{74D2}\x{74D3}\x{74D4}\x{74D5}\x{74D6}\x{74D7}' + . '\x{74D8}\x{74D9}\x{74DA}\x{74DB}\x{74DC}\x{74DD}\x{74DE}\x{74DF}\x{74E0}' + . '\x{74E1}\x{74E2}\x{74E3}\x{74E4}\x{74E5}\x{74E6}\x{74E7}\x{74E8}\x{74E9}' + . '\x{74EA}\x{74EC}\x{74ED}\x{74EE}\x{74EF}\x{74F0}\x{74F1}\x{74F2}\x{74F3}' + . '\x{74F4}\x{74F5}\x{74F6}\x{74F7}\x{74F8}\x{74F9}\x{74FA}\x{74FB}\x{74FC}' + . '\x{74FD}\x{74FE}\x{74FF}\x{7500}\x{7501}\x{7502}\x{7503}\x{7504}\x{7505}' + . '\x{7506}\x{7507}\x{7508}\x{7509}\x{750A}\x{750B}\x{750C}\x{750D}\x{750F}' + . '\x{7510}\x{7511}\x{7512}\x{7513}\x{7514}\x{7515}\x{7516}\x{7517}\x{7518}' + . '\x{7519}\x{751A}\x{751B}\x{751C}\x{751D}\x{751E}\x{751F}\x{7521}\x{7522}' + . '\x{7523}\x{7524}\x{7525}\x{7526}\x{7527}\x{7528}\x{7529}\x{752A}\x{752B}' + . '\x{752C}\x{752D}\x{752E}\x{752F}\x{7530}\x{7531}\x{7532}\x{7533}\x{7535}' + . '\x{7536}\x{7537}\x{7538}\x{7539}\x{753A}\x{753B}\x{753C}\x{753D}\x{753E}' + . '\x{753F}\x{7540}\x{7542}\x{7543}\x{7544}\x{7545}\x{7546}\x{7547}\x{7548}' + . '\x{7549}\x{754B}\x{754C}\x{754D}\x{754E}\x{754F}\x{7550}\x{7551}\x{7553}' + . '\x{7554}\x{7556}\x{7557}\x{7558}\x{7559}\x{755A}\x{755B}\x{755C}\x{755D}' + . '\x{755F}\x{7560}\x{7562}\x{7563}\x{7564}\x{7565}\x{7566}\x{7567}\x{7568}' + . '\x{7569}\x{756A}\x{756B}\x{756C}\x{756D}\x{756E}\x{756F}\x{7570}\x{7572}' + . '\x{7574}\x{7575}\x{7576}\x{7577}\x{7578}\x{7579}\x{757C}\x{757D}\x{757E}' + . '\x{757F}\x{7580}\x{7581}\x{7582}\x{7583}\x{7584}\x{7586}\x{7587}\x{7588}' + . '\x{7589}\x{758A}\x{758B}\x{758C}\x{758D}\x{758F}\x{7590}\x{7591}\x{7592}' + . '\x{7593}\x{7594}\x{7595}\x{7596}\x{7597}\x{7598}\x{7599}\x{759A}\x{759B}' + . '\x{759C}\x{759D}\x{759E}\x{759F}\x{75A0}\x{75A1}\x{75A2}\x{75A3}\x{75A4}' + . '\x{75A5}\x{75A6}\x{75A7}\x{75A8}\x{75AA}\x{75AB}\x{75AC}\x{75AD}\x{75AE}' + . '\x{75AF}\x{75B0}\x{75B1}\x{75B2}\x{75B3}\x{75B4}\x{75B5}\x{75B6}\x{75B8}' + . '\x{75B9}\x{75BA}\x{75BB}\x{75BC}\x{75BD}\x{75BE}\x{75BF}\x{75C0}\x{75C1}' + . '\x{75C2}\x{75C3}\x{75C4}\x{75C5}\x{75C6}\x{75C7}\x{75C8}\x{75C9}\x{75CA}' + . '\x{75CB}\x{75CC}\x{75CD}\x{75CE}\x{75CF}\x{75D0}\x{75D1}\x{75D2}\x{75D3}' + . '\x{75D4}\x{75D5}\x{75D6}\x{75D7}\x{75D8}\x{75D9}\x{75DA}\x{75DB}\x{75DD}' + . '\x{75DE}\x{75DF}\x{75E0}\x{75E1}\x{75E2}\x{75E3}\x{75E4}\x{75E5}\x{75E6}' + . '\x{75E7}\x{75E8}\x{75EA}\x{75EB}\x{75EC}\x{75ED}\x{75EF}\x{75F0}\x{75F1}' + . '\x{75F2}\x{75F3}\x{75F4}\x{75F5}\x{75F6}\x{75F7}\x{75F8}\x{75F9}\x{75FA}' + . '\x{75FB}\x{75FC}\x{75FD}\x{75FE}\x{75FF}\x{7600}\x{7601}\x{7602}\x{7603}' + . '\x{7604}\x{7605}\x{7606}\x{7607}\x{7608}\x{7609}\x{760A}\x{760B}\x{760C}' + . '\x{760D}\x{760E}\x{760F}\x{7610}\x{7611}\x{7612}\x{7613}\x{7614}\x{7615}' + . '\x{7616}\x{7617}\x{7618}\x{7619}\x{761A}\x{761B}\x{761C}\x{761D}\x{761E}' + . '\x{761F}\x{7620}\x{7621}\x{7622}\x{7623}\x{7624}\x{7625}\x{7626}\x{7627}' + . '\x{7628}\x{7629}\x{762A}\x{762B}\x{762D}\x{762E}\x{762F}\x{7630}\x{7631}' + . '\x{7632}\x{7633}\x{7634}\x{7635}\x{7636}\x{7637}\x{7638}\x{7639}\x{763A}' + . '\x{763B}\x{763C}\x{763D}\x{763E}\x{763F}\x{7640}\x{7641}\x{7642}\x{7643}' + . '\x{7646}\x{7647}\x{7648}\x{7649}\x{764A}\x{764B}\x{764C}\x{764D}\x{764F}' + . '\x{7650}\x{7652}\x{7653}\x{7654}\x{7656}\x{7657}\x{7658}\x{7659}\x{765A}' + . '\x{765B}\x{765C}\x{765D}\x{765E}\x{765F}\x{7660}\x{7661}\x{7662}\x{7663}' + . '\x{7664}\x{7665}\x{7666}\x{7667}\x{7668}\x{7669}\x{766A}\x{766B}\x{766C}' + . '\x{766D}\x{766E}\x{766F}\x{7670}\x{7671}\x{7672}\x{7674}\x{7675}\x{7676}' + . '\x{7677}\x{7678}\x{7679}\x{767B}\x{767C}\x{767D}\x{767E}\x{767F}\x{7680}' + . '\x{7681}\x{7682}\x{7683}\x{7684}\x{7685}\x{7686}\x{7687}\x{7688}\x{7689}' + . '\x{768A}\x{768B}\x{768C}\x{768E}\x{768F}\x{7690}\x{7691}\x{7692}\x{7693}' + . '\x{7694}\x{7695}\x{7696}\x{7697}\x{7698}\x{7699}\x{769A}\x{769B}\x{769C}' + . '\x{769D}\x{769E}\x{769F}\x{76A0}\x{76A3}\x{76A4}\x{76A6}\x{76A7}\x{76A9}' + . '\x{76AA}\x{76AB}\x{76AC}\x{76AD}\x{76AE}\x{76AF}\x{76B0}\x{76B1}\x{76B2}' + . '\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}\x{76BB}\x{76BC}\x{76BD}\x{76BE}' + . '\x{76BF}\x{76C0}\x{76C2}\x{76C3}\x{76C4}\x{76C5}\x{76C6}\x{76C7}\x{76C8}' + . '\x{76C9}\x{76CA}\x{76CD}\x{76CE}\x{76CF}\x{76D0}\x{76D1}\x{76D2}\x{76D3}' + . '\x{76D4}\x{76D5}\x{76D6}\x{76D7}\x{76D8}\x{76DA}\x{76DB}\x{76DC}\x{76DD}' + . '\x{76DE}\x{76DF}\x{76E0}\x{76E1}\x{76E2}\x{76E3}\x{76E4}\x{76E5}\x{76E6}' + . '\x{76E7}\x{76E8}\x{76E9}\x{76EA}\x{76EC}\x{76ED}\x{76EE}\x{76EF}\x{76F0}' + . '\x{76F1}\x{76F2}\x{76F3}\x{76F4}\x{76F5}\x{76F6}\x{76F7}\x{76F8}\x{76F9}' + . '\x{76FA}\x{76FB}\x{76FC}\x{76FD}\x{76FE}\x{76FF}\x{7701}\x{7703}\x{7704}' + . '\x{7705}\x{7706}\x{7707}\x{7708}\x{7709}\x{770A}\x{770B}\x{770C}\x{770D}' + . '\x{770F}\x{7710}\x{7711}\x{7712}\x{7713}\x{7714}\x{7715}\x{7716}\x{7717}' + . '\x{7718}\x{7719}\x{771A}\x{771B}\x{771C}\x{771D}\x{771E}\x{771F}\x{7720}' + . '\x{7722}\x{7723}\x{7725}\x{7726}\x{7727}\x{7728}\x{7729}\x{772A}\x{772C}' + . '\x{772D}\x{772E}\x{772F}\x{7730}\x{7731}\x{7732}\x{7733}\x{7734}\x{7735}' + . '\x{7736}\x{7737}\x{7738}\x{7739}\x{773A}\x{773B}\x{773C}\x{773D}\x{773E}' + . '\x{7740}\x{7741}\x{7743}\x{7744}\x{7745}\x{7746}\x{7747}\x{7748}\x{7749}' + . '\x{774A}\x{774B}\x{774C}\x{774D}\x{774E}\x{774F}\x{7750}\x{7751}\x{7752}' + . '\x{7753}\x{7754}\x{7755}\x{7756}\x{7757}\x{7758}\x{7759}\x{775A}\x{775B}' + . '\x{775C}\x{775D}\x{775E}\x{775F}\x{7760}\x{7761}\x{7762}\x{7763}\x{7765}' + . '\x{7766}\x{7767}\x{7768}\x{7769}\x{776A}\x{776B}\x{776C}\x{776D}\x{776E}' + . '\x{776F}\x{7770}\x{7771}\x{7772}\x{7773}\x{7774}\x{7775}\x{7776}\x{7777}' + . '\x{7778}\x{7779}\x{777A}\x{777B}\x{777C}\x{777D}\x{777E}\x{777F}\x{7780}' + . '\x{7781}\x{7782}\x{7783}\x{7784}\x{7785}\x{7786}\x{7787}\x{7788}\x{7789}' + . '\x{778A}\x{778B}\x{778C}\x{778D}\x{778E}\x{778F}\x{7790}\x{7791}\x{7792}' + . '\x{7793}\x{7794}\x{7795}\x{7797}\x{7798}\x{7799}\x{779A}\x{779B}\x{779C}' + . '\x{779D}\x{779E}\x{779F}\x{77A0}\x{77A1}\x{77A2}\x{77A3}\x{77A5}\x{77A6}' + . '\x{77A7}\x{77A8}\x{77A9}\x{77AA}\x{77AB}\x{77AC}\x{77AD}\x{77AE}\x{77AF}' + . '\x{77B0}\x{77B1}\x{77B2}\x{77B3}\x{77B4}\x{77B5}\x{77B6}\x{77B7}\x{77B8}' + . '\x{77B9}\x{77BA}\x{77BB}\x{77BC}\x{77BD}\x{77BF}\x{77C0}\x{77C2}\x{77C3}' + . '\x{77C4}\x{77C5}\x{77C6}\x{77C7}\x{77C8}\x{77C9}\x{77CA}\x{77CB}\x{77CC}' + . '\x{77CD}\x{77CE}\x{77CF}\x{77D0}\x{77D1}\x{77D3}\x{77D4}\x{77D5}\x{77D6}' + . '\x{77D7}\x{77D8}\x{77D9}\x{77DA}\x{77DB}\x{77DC}\x{77DE}\x{77DF}\x{77E0}' + . '\x{77E1}\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E8}\x{77E9}\x{77EA}\x{77EB}' + . '\x{77EC}\x{77ED}\x{77EE}\x{77EF}\x{77F0}\x{77F1}\x{77F2}\x{77F3}\x{77F6}' + . '\x{77F7}\x{77F8}\x{77F9}\x{77FA}\x{77FB}\x{77FC}\x{77FD}\x{77FE}\x{77FF}' + . '\x{7800}\x{7801}\x{7802}\x{7803}\x{7804}\x{7805}\x{7806}\x{7808}\x{7809}' + . '\x{780A}\x{780B}\x{780C}\x{780D}\x{780E}\x{780F}\x{7810}\x{7811}\x{7812}' + . '\x{7813}\x{7814}\x{7815}\x{7816}\x{7817}\x{7818}\x{7819}\x{781A}\x{781B}' + . '\x{781C}\x{781D}\x{781E}\x{781F}\x{7820}\x{7821}\x{7822}\x{7823}\x{7825}' + . '\x{7826}\x{7827}\x{7828}\x{7829}\x{782A}\x{782B}\x{782C}\x{782D}\x{782E}' + . '\x{782F}\x{7830}\x{7831}\x{7832}\x{7833}\x{7834}\x{7835}\x{7837}\x{7838}' + . '\x{7839}\x{783A}\x{783B}\x{783C}\x{783D}\x{783E}\x{7840}\x{7841}\x{7843}' + . '\x{7844}\x{7845}\x{7847}\x{7848}\x{7849}\x{784A}\x{784C}\x{784D}\x{784E}' + . '\x{7850}\x{7851}\x{7852}\x{7853}\x{7854}\x{7855}\x{7856}\x{7857}\x{7858}' + . '\x{7859}\x{785A}\x{785B}\x{785C}\x{785D}\x{785E}\x{785F}\x{7860}\x{7861}' + . '\x{7862}\x{7863}\x{7864}\x{7865}\x{7866}\x{7867}\x{7868}\x{7869}\x{786A}' + . '\x{786B}\x{786C}\x{786D}\x{786E}\x{786F}\x{7870}\x{7871}\x{7872}\x{7873}' + . '\x{7874}\x{7875}\x{7877}\x{7878}\x{7879}\x{787A}\x{787B}\x{787C}\x{787D}' + . '\x{787E}\x{787F}\x{7880}\x{7881}\x{7882}\x{7883}\x{7884}\x{7885}\x{7886}' + . '\x{7887}\x{7889}\x{788A}\x{788B}\x{788C}\x{788D}\x{788E}\x{788F}\x{7890}' + . '\x{7891}\x{7892}\x{7893}\x{7894}\x{7895}\x{7896}\x{7897}\x{7898}\x{7899}' + . '\x{789A}\x{789B}\x{789C}\x{789D}\x{789E}\x{789F}\x{78A0}\x{78A1}\x{78A2}' + . '\x{78A3}\x{78A4}\x{78A5}\x{78A6}\x{78A7}\x{78A8}\x{78A9}\x{78AA}\x{78AB}' + . '\x{78AC}\x{78AD}\x{78AE}\x{78AF}\x{78B0}\x{78B1}\x{78B2}\x{78B3}\x{78B4}' + . '\x{78B5}\x{78B6}\x{78B7}\x{78B8}\x{78B9}\x{78BA}\x{78BB}\x{78BC}\x{78BD}' + . '\x{78BE}\x{78BF}\x{78C0}\x{78C1}\x{78C3}\x{78C4}\x{78C5}\x{78C6}\x{78C8}' + . '\x{78C9}\x{78CA}\x{78CB}\x{78CC}\x{78CD}\x{78CE}\x{78CF}\x{78D0}\x{78D1}' + . '\x{78D3}\x{78D4}\x{78D5}\x{78D6}\x{78D7}\x{78D8}\x{78D9}\x{78DA}\x{78DB}' + . '\x{78DC}\x{78DD}\x{78DE}\x{78DF}\x{78E0}\x{78E1}\x{78E2}\x{78E3}\x{78E4}' + . '\x{78E5}\x{78E6}\x{78E7}\x{78E8}\x{78E9}\x{78EA}\x{78EB}\x{78EC}\x{78ED}' + . '\x{78EE}\x{78EF}\x{78F1}\x{78F2}\x{78F3}\x{78F4}\x{78F5}\x{78F6}\x{78F7}' + . '\x{78F9}\x{78FA}\x{78FB}\x{78FC}\x{78FD}\x{78FE}\x{78FF}\x{7901}\x{7902}' + . '\x{7903}\x{7904}\x{7905}\x{7906}\x{7907}\x{7909}\x{790A}\x{790B}\x{790C}' + . '\x{790E}\x{790F}\x{7910}\x{7911}\x{7912}\x{7913}\x{7914}\x{7916}\x{7917}' + . '\x{7918}\x{7919}\x{791A}\x{791B}\x{791C}\x{791D}\x{791E}\x{7921}\x{7922}' + . '\x{7923}\x{7924}\x{7925}\x{7926}\x{7927}\x{7928}\x{7929}\x{792A}\x{792B}' + . '\x{792C}\x{792D}\x{792E}\x{792F}\x{7930}\x{7931}\x{7933}\x{7934}\x{7935}' + . '\x{7937}\x{7938}\x{7939}\x{793A}\x{793B}\x{793C}\x{793D}\x{793E}\x{793F}' + . '\x{7940}\x{7941}\x{7942}\x{7943}\x{7944}\x{7945}\x{7946}\x{7947}\x{7948}' + . '\x{7949}\x{794A}\x{794B}\x{794C}\x{794D}\x{794E}\x{794F}\x{7950}\x{7951}' + . '\x{7952}\x{7953}\x{7954}\x{7955}\x{7956}\x{7957}\x{7958}\x{795A}\x{795B}' + . '\x{795C}\x{795D}\x{795E}\x{795F}\x{7960}\x{7961}\x{7962}\x{7963}\x{7964}' + . '\x{7965}\x{7966}\x{7967}\x{7968}\x{7969}\x{796A}\x{796B}\x{796D}\x{796F}' + . '\x{7970}\x{7971}\x{7972}\x{7973}\x{7974}\x{7977}\x{7978}\x{7979}\x{797A}' + . '\x{797B}\x{797C}\x{797D}\x{797E}\x{797F}\x{7980}\x{7981}\x{7982}\x{7983}' + . '\x{7984}\x{7985}\x{7988}\x{7989}\x{798A}\x{798B}\x{798C}\x{798D}\x{798E}' + . '\x{798F}\x{7990}\x{7991}\x{7992}\x{7993}\x{7994}\x{7995}\x{7996}\x{7997}' + . '\x{7998}\x{7999}\x{799A}\x{799B}\x{799C}\x{799F}\x{79A0}\x{79A1}\x{79A2}' + . '\x{79A3}\x{79A4}\x{79A5}\x{79A6}\x{79A7}\x{79A8}\x{79AA}\x{79AB}\x{79AC}' + . '\x{79AD}\x{79AE}\x{79AF}\x{79B0}\x{79B1}\x{79B2}\x{79B3}\x{79B4}\x{79B5}' + . '\x{79B6}\x{79B7}\x{79B8}\x{79B9}\x{79BA}\x{79BB}\x{79BD}\x{79BE}\x{79BF}' + . '\x{79C0}\x{79C1}\x{79C2}\x{79C3}\x{79C5}\x{79C6}\x{79C8}\x{79C9}\x{79CA}' + . '\x{79CB}\x{79CD}\x{79CE}\x{79CF}\x{79D0}\x{79D1}\x{79D2}\x{79D3}\x{79D5}' + . '\x{79D6}\x{79D8}\x{79D9}\x{79DA}\x{79DB}\x{79DC}\x{79DD}\x{79DE}\x{79DF}' + . '\x{79E0}\x{79E1}\x{79E2}\x{79E3}\x{79E4}\x{79E5}\x{79E6}\x{79E7}\x{79E8}' + . '\x{79E9}\x{79EA}\x{79EB}\x{79EC}\x{79ED}\x{79EE}\x{79EF}\x{79F0}\x{79F1}' + . '\x{79F2}\x{79F3}\x{79F4}\x{79F5}\x{79F6}\x{79F7}\x{79F8}\x{79F9}\x{79FA}' + . '\x{79FB}\x{79FC}\x{79FD}\x{79FE}\x{79FF}\x{7A00}\x{7A02}\x{7A03}\x{7A04}' + . '\x{7A05}\x{7A06}\x{7A08}\x{7A0A}\x{7A0B}\x{7A0C}\x{7A0D}\x{7A0E}\x{7A0F}' + . '\x{7A10}\x{7A11}\x{7A12}\x{7A13}\x{7A14}\x{7A15}\x{7A16}\x{7A17}\x{7A18}' + . '\x{7A19}\x{7A1A}\x{7A1B}\x{7A1C}\x{7A1D}\x{7A1E}\x{7A1F}\x{7A20}\x{7A21}' + . '\x{7A22}\x{7A23}\x{7A24}\x{7A25}\x{7A26}\x{7A27}\x{7A28}\x{7A29}\x{7A2A}' + . '\x{7A2B}\x{7A2D}\x{7A2E}\x{7A2F}\x{7A30}\x{7A31}\x{7A32}\x{7A33}\x{7A34}' + . '\x{7A35}\x{7A37}\x{7A39}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' + . '\x{7A41}\x{7A42}\x{7A43}\x{7A44}\x{7A45}\x{7A46}\x{7A47}\x{7A48}\x{7A49}' + . '\x{7A4A}\x{7A4B}\x{7A4C}\x{7A4D}\x{7A4E}\x{7A50}\x{7A51}\x{7A52}\x{7A53}' + . '\x{7A54}\x{7A55}\x{7A56}\x{7A57}\x{7A58}\x{7A59}\x{7A5A}\x{7A5B}\x{7A5C}' + . '\x{7A5D}\x{7A5E}\x{7A5F}\x{7A60}\x{7A61}\x{7A62}\x{7A65}\x{7A66}\x{7A67}' + . '\x{7A68}\x{7A69}\x{7A6B}\x{7A6C}\x{7A6D}\x{7A6E}\x{7A70}\x{7A71}\x{7A72}' + . '\x{7A73}\x{7A74}\x{7A75}\x{7A76}\x{7A77}\x{7A78}\x{7A79}\x{7A7A}\x{7A7B}' + . '\x{7A7C}\x{7A7D}\x{7A7E}\x{7A7F}\x{7A80}\x{7A81}\x{7A83}\x{7A84}\x{7A85}' + . '\x{7A86}\x{7A87}\x{7A88}\x{7A89}\x{7A8A}\x{7A8B}\x{7A8C}\x{7A8D}\x{7A8E}' + . '\x{7A8F}\x{7A90}\x{7A91}\x{7A92}\x{7A93}\x{7A94}\x{7A95}\x{7A96}\x{7A97}' + . '\x{7A98}\x{7A99}\x{7A9C}\x{7A9D}\x{7A9E}\x{7A9F}\x{7AA0}\x{7AA1}\x{7AA2}' + . '\x{7AA3}\x{7AA4}\x{7AA5}\x{7AA6}\x{7AA7}\x{7AA8}\x{7AA9}\x{7AAA}\x{7AAB}' + . '\x{7AAC}\x{7AAD}\x{7AAE}\x{7AAF}\x{7AB0}\x{7AB1}\x{7AB2}\x{7AB3}\x{7AB4}' + . '\x{7AB5}\x{7AB6}\x{7AB7}\x{7AB8}\x{7ABA}\x{7ABE}\x{7ABF}\x{7AC0}\x{7AC1}' + . '\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}\x{7AC9}\x{7ACA}\x{7ACB}\x{7ACC}\x{7ACD}' + . '\x{7ACE}\x{7ACF}\x{7AD0}\x{7AD1}\x{7AD2}\x{7AD3}\x{7AD4}\x{7AD5}\x{7AD6}' + . '\x{7AD8}\x{7AD9}\x{7ADB}\x{7ADC}\x{7ADD}\x{7ADE}\x{7ADF}\x{7AE0}\x{7AE1}' + . '\x{7AE2}\x{7AE3}\x{7AE4}\x{7AE5}\x{7AE6}\x{7AE7}\x{7AE8}\x{7AEA}\x{7AEB}' + . '\x{7AEC}\x{7AED}\x{7AEE}\x{7AEF}\x{7AF0}\x{7AF1}\x{7AF2}\x{7AF3}\x{7AF4}' + . '\x{7AF6}\x{7AF7}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFB}\x{7AFD}\x{7AFE}\x{7AFF}' + . '\x{7B00}\x{7B01}\x{7B02}\x{7B03}\x{7B04}\x{7B05}\x{7B06}\x{7B08}\x{7B09}' + . '\x{7B0A}\x{7B0B}\x{7B0C}\x{7B0D}\x{7B0E}\x{7B0F}\x{7B10}\x{7B11}\x{7B12}' + . '\x{7B13}\x{7B14}\x{7B15}\x{7B16}\x{7B17}\x{7B18}\x{7B19}\x{7B1A}\x{7B1B}' + . '\x{7B1C}\x{7B1D}\x{7B1E}\x{7B20}\x{7B21}\x{7B22}\x{7B23}\x{7B24}\x{7B25}' + . '\x{7B26}\x{7B28}\x{7B2A}\x{7B2B}\x{7B2C}\x{7B2D}\x{7B2E}\x{7B2F}\x{7B30}' + . '\x{7B31}\x{7B32}\x{7B33}\x{7B34}\x{7B35}\x{7B36}\x{7B37}\x{7B38}\x{7B39}' + . '\x{7B3A}\x{7B3B}\x{7B3C}\x{7B3D}\x{7B3E}\x{7B3F}\x{7B40}\x{7B41}\x{7B43}' + . '\x{7B44}\x{7B45}\x{7B46}\x{7B47}\x{7B48}\x{7B49}\x{7B4A}\x{7B4B}\x{7B4C}' + . '\x{7B4D}\x{7B4E}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B55}\x{7B56}' + . '\x{7B57}\x{7B58}\x{7B59}\x{7B5A}\x{7B5B}\x{7B5C}\x{7B5D}\x{7B5E}\x{7B5F}' + . '\x{7B60}\x{7B61}\x{7B62}\x{7B63}\x{7B64}\x{7B65}\x{7B66}\x{7B67}\x{7B68}' + . '\x{7B69}\x{7B6A}\x{7B6B}\x{7B6C}\x{7B6D}\x{7B6E}\x{7B70}\x{7B71}\x{7B72}' + . '\x{7B73}\x{7B74}\x{7B75}\x{7B76}\x{7B77}\x{7B78}\x{7B79}\x{7B7B}\x{7B7C}' + . '\x{7B7D}\x{7B7E}\x{7B7F}\x{7B80}\x{7B81}\x{7B82}\x{7B83}\x{7B84}\x{7B85}' + . '\x{7B87}\x{7B88}\x{7B89}\x{7B8A}\x{7B8B}\x{7B8C}\x{7B8D}\x{7B8E}\x{7B8F}' + . '\x{7B90}\x{7B91}\x{7B93}\x{7B94}\x{7B95}\x{7B96}\x{7B97}\x{7B98}\x{7B99}' + . '\x{7B9A}\x{7B9B}\x{7B9C}\x{7B9D}\x{7B9E}\x{7B9F}\x{7BA0}\x{7BA1}\x{7BA2}' + . '\x{7BA4}\x{7BA6}\x{7BA7}\x{7BA8}\x{7BA9}\x{7BAA}\x{7BAB}\x{7BAC}\x{7BAD}' + . '\x{7BAE}\x{7BAF}\x{7BB1}\x{7BB3}\x{7BB4}\x{7BB5}\x{7BB6}\x{7BB7}\x{7BB8}' + . '\x{7BB9}\x{7BBA}\x{7BBB}\x{7BBC}\x{7BBD}\x{7BBE}\x{7BBF}\x{7BC0}\x{7BC1}' + . '\x{7BC2}\x{7BC3}\x{7BC4}\x{7BC5}\x{7BC6}\x{7BC7}\x{7BC8}\x{7BC9}\x{7BCA}' + . '\x{7BCB}\x{7BCC}\x{7BCD}\x{7BCE}\x{7BD0}\x{7BD1}\x{7BD2}\x{7BD3}\x{7BD4}' + . '\x{7BD5}\x{7BD6}\x{7BD7}\x{7BD8}\x{7BD9}\x{7BDA}\x{7BDB}\x{7BDC}\x{7BDD}' + . '\x{7BDE}\x{7BDF}\x{7BE0}\x{7BE1}\x{7BE2}\x{7BE3}\x{7BE4}\x{7BE5}\x{7BE6}' + . '\x{7BE7}\x{7BE8}\x{7BE9}\x{7BEA}\x{7BEB}\x{7BEC}\x{7BED}\x{7BEE}\x{7BEF}' + . '\x{7BF0}\x{7BF1}\x{7BF2}\x{7BF3}\x{7BF4}\x{7BF5}\x{7BF6}\x{7BF7}\x{7BF8}' + . '\x{7BF9}\x{7BFB}\x{7BFC}\x{7BFD}\x{7BFE}\x{7BFF}\x{7C00}\x{7C01}\x{7C02}' + . '\x{7C03}\x{7C04}\x{7C05}\x{7C06}\x{7C07}\x{7C08}\x{7C09}\x{7C0A}\x{7C0B}' + . '\x{7C0C}\x{7C0D}\x{7C0E}\x{7C0F}\x{7C10}\x{7C11}\x{7C12}\x{7C13}\x{7C15}' + . '\x{7C16}\x{7C17}\x{7C18}\x{7C19}\x{7C1A}\x{7C1C}\x{7C1D}\x{7C1E}\x{7C1F}' + . '\x{7C20}\x{7C21}\x{7C22}\x{7C23}\x{7C24}\x{7C25}\x{7C26}\x{7C27}\x{7C28}' + . '\x{7C29}\x{7C2A}\x{7C2B}\x{7C2C}\x{7C2D}\x{7C30}\x{7C31}\x{7C32}\x{7C33}' + . '\x{7C34}\x{7C35}\x{7C36}\x{7C37}\x{7C38}\x{7C39}\x{7C3A}\x{7C3B}\x{7C3C}' + . '\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C41}\x{7C42}\x{7C43}\x{7C44}\x{7C45}' + . '\x{7C46}\x{7C47}\x{7C48}\x{7C49}\x{7C4A}\x{7C4B}\x{7C4C}\x{7C4D}\x{7C4E}' + . '\x{7C50}\x{7C51}\x{7C53}\x{7C54}\x{7C56}\x{7C57}\x{7C58}\x{7C59}\x{7C5A}' + . '\x{7C5B}\x{7C5C}\x{7C5E}\x{7C5F}\x{7C60}\x{7C61}\x{7C62}\x{7C63}\x{7C64}' + . '\x{7C65}\x{7C66}\x{7C67}\x{7C68}\x{7C69}\x{7C6A}\x{7C6B}\x{7C6C}\x{7C6D}' + . '\x{7C6E}\x{7C6F}\x{7C70}\x{7C71}\x{7C72}\x{7C73}\x{7C74}\x{7C75}\x{7C77}' + . '\x{7C78}\x{7C79}\x{7C7A}\x{7C7B}\x{7C7C}\x{7C7D}\x{7C7E}\x{7C7F}\x{7C80}' + . '\x{7C81}\x{7C82}\x{7C84}\x{7C85}\x{7C86}\x{7C88}\x{7C89}\x{7C8A}\x{7C8B}' + . '\x{7C8C}\x{7C8D}\x{7C8E}\x{7C8F}\x{7C90}\x{7C91}\x{7C92}\x{7C94}\x{7C95}' + . '\x{7C96}\x{7C97}\x{7C98}\x{7C99}\x{7C9B}\x{7C9C}\x{7C9D}\x{7C9E}\x{7C9F}' + . '\x{7CA0}\x{7CA1}\x{7CA2}\x{7CA3}\x{7CA4}\x{7CA5}\x{7CA6}\x{7CA7}\x{7CA8}' + . '\x{7CA9}\x{7CAA}\x{7CAD}\x{7CAE}\x{7CAF}\x{7CB0}\x{7CB1}\x{7CB2}\x{7CB3}' + . '\x{7CB4}\x{7CB5}\x{7CB6}\x{7CB7}\x{7CB8}\x{7CB9}\x{7CBA}\x{7CBB}\x{7CBC}' + . '\x{7CBD}\x{7CBE}\x{7CBF}\x{7CC0}\x{7CC1}\x{7CC2}\x{7CC3}\x{7CC4}\x{7CC5}' + . '\x{7CC6}\x{7CC7}\x{7CC8}\x{7CC9}\x{7CCA}\x{7CCB}\x{7CCC}\x{7CCD}\x{7CCE}' + . '\x{7CCF}\x{7CD0}\x{7CD1}\x{7CD2}\x{7CD4}\x{7CD5}\x{7CD6}\x{7CD7}\x{7CD8}' + . '\x{7CD9}\x{7CDC}\x{7CDD}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}' + . '\x{7CE8}\x{7CE9}\x{7CEA}\x{7CEB}\x{7CEC}\x{7CED}\x{7CEE}\x{7CEF}\x{7CF0}' + . '\x{7CF1}\x{7CF2}\x{7CF3}\x{7CF4}\x{7CF5}\x{7CF6}\x{7CF7}\x{7CF8}\x{7CF9}' + . '\x{7CFA}\x{7CFB}\x{7CFD}\x{7CFE}\x{7D00}\x{7D01}\x{7D02}\x{7D03}\x{7D04}' + . '\x{7D05}\x{7D06}\x{7D07}\x{7D08}\x{7D09}\x{7D0A}\x{7D0B}\x{7D0C}\x{7D0D}' + . '\x{7D0E}\x{7D0F}\x{7D10}\x{7D11}\x{7D12}\x{7D13}\x{7D14}\x{7D15}\x{7D16}' + . '\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D1D}\x{7D1E}\x{7D1F}' + . '\x{7D20}\x{7D21}\x{7D22}\x{7D24}\x{7D25}\x{7D26}\x{7D27}\x{7D28}\x{7D29}' + . '\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D31}\x{7D32}\x{7D33}\x{7D34}' + . '\x{7D35}\x{7D36}\x{7D37}\x{7D38}\x{7D39}\x{7D3A}\x{7D3B}\x{7D3C}\x{7D3D}' + . '\x{7D3E}\x{7D3F}\x{7D40}\x{7D41}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}' + . '\x{7D47}\x{7D49}\x{7D4A}\x{7D4B}\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D51}' + . '\x{7D52}\x{7D53}\x{7D54}\x{7D55}\x{7D56}\x{7D57}\x{7D58}\x{7D59}\x{7D5B}' + . '\x{7D5C}\x{7D5D}\x{7D5E}\x{7D5F}\x{7D60}\x{7D61}\x{7D62}\x{7D63}\x{7D65}' + . '\x{7D66}\x{7D67}\x{7D68}\x{7D69}\x{7D6A}\x{7D6B}\x{7D6C}\x{7D6D}\x{7D6E}' + . '\x{7D6F}\x{7D70}\x{7D71}\x{7D72}\x{7D73}\x{7D74}\x{7D75}\x{7D76}\x{7D77}' + . '\x{7D79}\x{7D7A}\x{7D7B}\x{7D7C}\x{7D7D}\x{7D7E}\x{7D7F}\x{7D80}\x{7D81}' + . '\x{7D83}\x{7D84}\x{7D85}\x{7D86}\x{7D87}\x{7D88}\x{7D89}\x{7D8A}\x{7D8B}' + . '\x{7D8C}\x{7D8D}\x{7D8E}\x{7D8F}\x{7D90}\x{7D91}\x{7D92}\x{7D93}\x{7D94}' + . '\x{7D96}\x{7D97}\x{7D99}\x{7D9B}\x{7D9C}\x{7D9D}\x{7D9E}\x{7D9F}\x{7DA0}' + . '\x{7DA1}\x{7DA2}\x{7DA3}\x{7DA5}\x{7DA6}\x{7DA7}\x{7DA9}\x{7DAA}\x{7DAB}' + . '\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}\x{7DB1}\x{7DB2}\x{7DB3}\x{7DB4}' + . '\x{7DB5}\x{7DB6}\x{7DB7}\x{7DB8}\x{7DB9}\x{7DBA}\x{7DBB}\x{7DBC}\x{7DBD}' + . '\x{7DBE}\x{7DBF}\x{7DC0}\x{7DC1}\x{7DC2}\x{7DC3}\x{7DC4}\x{7DC5}\x{7DC6}' + . '\x{7DC7}\x{7DC8}\x{7DC9}\x{7DCA}\x{7DCB}\x{7DCC}\x{7DCE}\x{7DCF}\x{7DD0}' + . '\x{7DD1}\x{7DD2}\x{7DD4}\x{7DD5}\x{7DD6}\x{7DD7}\x{7DD8}\x{7DD9}\x{7DDA}' + . '\x{7DDB}\x{7DDD}\x{7DDE}\x{7DDF}\x{7DE0}\x{7DE1}\x{7DE2}\x{7DE3}\x{7DE6}' + . '\x{7DE7}\x{7DE8}\x{7DE9}\x{7DEA}\x{7DEC}\x{7DED}\x{7DEE}\x{7DEF}\x{7DF0}' + . '\x{7DF1}\x{7DF2}\x{7DF3}\x{7DF4}\x{7DF5}\x{7DF6}\x{7DF7}\x{7DF8}\x{7DF9}' + . '\x{7DFA}\x{7DFB}\x{7DFC}\x{7E00}\x{7E01}\x{7E02}\x{7E03}\x{7E04}\x{7E05}' + . '\x{7E06}\x{7E07}\x{7E08}\x{7E09}\x{7E0A}\x{7E0B}\x{7E0C}\x{7E0D}\x{7E0E}' + . '\x{7E0F}\x{7E10}\x{7E11}\x{7E12}\x{7E13}\x{7E14}\x{7E15}\x{7E16}\x{7E17}' + . '\x{7E19}\x{7E1A}\x{7E1B}\x{7E1C}\x{7E1D}\x{7E1E}\x{7E1F}\x{7E20}\x{7E21}' + . '\x{7E22}\x{7E23}\x{7E24}\x{7E25}\x{7E26}\x{7E27}\x{7E28}\x{7E29}\x{7E2A}' + . '\x{7E2B}\x{7E2C}\x{7E2D}\x{7E2E}\x{7E2F}\x{7E30}\x{7E31}\x{7E32}\x{7E33}' + . '\x{7E34}\x{7E35}\x{7E36}\x{7E37}\x{7E38}\x{7E39}\x{7E3A}\x{7E3B}\x{7E3C}' + . '\x{7E3D}\x{7E3E}\x{7E3F}\x{7E40}\x{7E41}\x{7E42}\x{7E43}\x{7E44}\x{7E45}' + . '\x{7E46}\x{7E47}\x{7E48}\x{7E49}\x{7E4C}\x{7E4D}\x{7E4E}\x{7E4F}\x{7E50}' + . '\x{7E51}\x{7E52}\x{7E53}\x{7E54}\x{7E55}\x{7E56}\x{7E57}\x{7E58}\x{7E59}' + . '\x{7E5A}\x{7E5C}\x{7E5D}\x{7E5E}\x{7E5F}\x{7E60}\x{7E61}\x{7E62}\x{7E63}' + . '\x{7E65}\x{7E66}\x{7E67}\x{7E68}\x{7E69}\x{7E6A}\x{7E6B}\x{7E6C}\x{7E6D}' + . '\x{7E6E}\x{7E6F}\x{7E70}\x{7E71}\x{7E72}\x{7E73}\x{7E74}\x{7E75}\x{7E76}' + . '\x{7E77}\x{7E78}\x{7E79}\x{7E7A}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7E}\x{7E7F}' + . '\x{7E80}\x{7E81}\x{7E82}\x{7E83}\x{7E84}\x{7E85}\x{7E86}\x{7E87}\x{7E88}' + . '\x{7E89}\x{7E8A}\x{7E8B}\x{7E8C}\x{7E8D}\x{7E8E}\x{7E8F}\x{7E90}\x{7E91}' + . '\x{7E92}\x{7E93}\x{7E94}\x{7E95}\x{7E96}\x{7E97}\x{7E98}\x{7E99}\x{7E9A}' + . '\x{7E9B}\x{7E9C}\x{7E9E}\x{7E9F}\x{7EA0}\x{7EA1}\x{7EA2}\x{7EA3}\x{7EA4}' + . '\x{7EA5}\x{7EA6}\x{7EA7}\x{7EA8}\x{7EA9}\x{7EAA}\x{7EAB}\x{7EAC}\x{7EAD}' + . '\x{7EAE}\x{7EAF}\x{7EB0}\x{7EB1}\x{7EB2}\x{7EB3}\x{7EB4}\x{7EB5}\x{7EB6}' + . '\x{7EB7}\x{7EB8}\x{7EB9}\x{7EBA}\x{7EBB}\x{7EBC}\x{7EBD}\x{7EBE}\x{7EBF}' + . '\x{7EC0}\x{7EC1}\x{7EC2}\x{7EC3}\x{7EC4}\x{7EC5}\x{7EC6}\x{7EC7}\x{7EC8}' + . '\x{7EC9}\x{7ECA}\x{7ECB}\x{7ECC}\x{7ECD}\x{7ECE}\x{7ECF}\x{7ED0}\x{7ED1}' + . '\x{7ED2}\x{7ED3}\x{7ED4}\x{7ED5}\x{7ED6}\x{7ED7}\x{7ED8}\x{7ED9}\x{7EDA}' + . '\x{7EDB}\x{7EDC}\x{7EDD}\x{7EDE}\x{7EDF}\x{7EE0}\x{7EE1}\x{7EE2}\x{7EE3}' + . '\x{7EE4}\x{7EE5}\x{7EE6}\x{7EE7}\x{7EE8}\x{7EE9}\x{7EEA}\x{7EEB}\x{7EEC}' + . '\x{7EED}\x{7EEE}\x{7EEF}\x{7EF0}\x{7EF1}\x{7EF2}\x{7EF3}\x{7EF4}\x{7EF5}' + . '\x{7EF6}\x{7EF7}\x{7EF8}\x{7EF9}\x{7EFA}\x{7EFB}\x{7EFC}\x{7EFD}\x{7EFE}' + . '\x{7EFF}\x{7F00}\x{7F01}\x{7F02}\x{7F03}\x{7F04}\x{7F05}\x{7F06}\x{7F07}' + . '\x{7F08}\x{7F09}\x{7F0A}\x{7F0B}\x{7F0C}\x{7F0D}\x{7F0E}\x{7F0F}\x{7F10}' + . '\x{7F11}\x{7F12}\x{7F13}\x{7F14}\x{7F15}\x{7F16}\x{7F17}\x{7F18}\x{7F19}' + . '\x{7F1A}\x{7F1B}\x{7F1C}\x{7F1D}\x{7F1E}\x{7F1F}\x{7F20}\x{7F21}\x{7F22}' + . '\x{7F23}\x{7F24}\x{7F25}\x{7F26}\x{7F27}\x{7F28}\x{7F29}\x{7F2A}\x{7F2B}' + . '\x{7F2C}\x{7F2D}\x{7F2E}\x{7F2F}\x{7F30}\x{7F31}\x{7F32}\x{7F33}\x{7F34}' + . '\x{7F35}\x{7F36}\x{7F37}\x{7F38}\x{7F39}\x{7F3A}\x{7F3D}\x{7F3E}\x{7F3F}' + . '\x{7F40}\x{7F42}\x{7F43}\x{7F44}\x{7F45}\x{7F47}\x{7F48}\x{7F49}\x{7F4A}' + . '\x{7F4B}\x{7F4C}\x{7F4D}\x{7F4E}\x{7F4F}\x{7F50}\x{7F51}\x{7F52}\x{7F53}' + . '\x{7F54}\x{7F55}\x{7F56}\x{7F57}\x{7F58}\x{7F5A}\x{7F5B}\x{7F5C}\x{7F5D}' + . '\x{7F5E}\x{7F5F}\x{7F60}\x{7F61}\x{7F62}\x{7F63}\x{7F64}\x{7F65}\x{7F66}' + . '\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6C}\x{7F6D}\x{7F6E}\x{7F6F}' + . '\x{7F70}\x{7F71}\x{7F72}\x{7F73}\x{7F74}\x{7F75}\x{7F76}\x{7F77}\x{7F78}' + . '\x{7F79}\x{7F7A}\x{7F7B}\x{7F7C}\x{7F7D}\x{7F7E}\x{7F7F}\x{7F80}\x{7F81}' + . '\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}\x{7F88}\x{7F89}\x{7F8A}\x{7F8B}' + . '\x{7F8C}\x{7F8D}\x{7F8E}\x{7F8F}\x{7F91}\x{7F92}\x{7F93}\x{7F94}\x{7F95}' + . '\x{7F96}\x{7F98}\x{7F9A}\x{7F9B}\x{7F9C}\x{7F9D}\x{7F9E}\x{7F9F}\x{7FA0}' + . '\x{7FA1}\x{7FA2}\x{7FA3}\x{7FA4}\x{7FA5}\x{7FA6}\x{7FA7}\x{7FA8}\x{7FA9}' + . '\x{7FAA}\x{7FAB}\x{7FAC}\x{7FAD}\x{7FAE}\x{7FAF}\x{7FB0}\x{7FB1}\x{7FB2}' + . '\x{7FB3}\x{7FB5}\x{7FB6}\x{7FB7}\x{7FB8}\x{7FB9}\x{7FBA}\x{7FBB}\x{7FBC}' + . '\x{7FBD}\x{7FBE}\x{7FBF}\x{7FC0}\x{7FC1}\x{7FC2}\x{7FC3}\x{7FC4}\x{7FC5}' + . '\x{7FC6}\x{7FC7}\x{7FC8}\x{7FC9}\x{7FCA}\x{7FCB}\x{7FCC}\x{7FCD}\x{7FCE}' + . '\x{7FCF}\x{7FD0}\x{7FD1}\x{7FD2}\x{7FD3}\x{7FD4}\x{7FD5}\x{7FD7}\x{7FD8}' + . '\x{7FD9}\x{7FDA}\x{7FDB}\x{7FDC}\x{7FDE}\x{7FDF}\x{7FE0}\x{7FE1}\x{7FE2}' + . '\x{7FE3}\x{7FE5}\x{7FE6}\x{7FE7}\x{7FE8}\x{7FE9}\x{7FEA}\x{7FEB}\x{7FEC}' + . '\x{7FED}\x{7FEE}\x{7FEF}\x{7FF0}\x{7FF1}\x{7FF2}\x{7FF3}\x{7FF4}\x{7FF5}' + . '\x{7FF6}\x{7FF7}\x{7FF8}\x{7FF9}\x{7FFA}\x{7FFB}\x{7FFC}\x{7FFD}\x{7FFE}' + . '\x{7FFF}\x{8000}\x{8001}\x{8002}\x{8003}\x{8004}\x{8005}\x{8006}\x{8007}' + . '\x{8008}\x{8009}\x{800B}\x{800C}\x{800D}\x{800E}\x{800F}\x{8010}\x{8011}' + . '\x{8012}\x{8013}\x{8014}\x{8015}\x{8016}\x{8017}\x{8018}\x{8019}\x{801A}' + . '\x{801B}\x{801C}\x{801D}\x{801E}\x{801F}\x{8020}\x{8021}\x{8022}\x{8023}' + . '\x{8024}\x{8025}\x{8026}\x{8027}\x{8028}\x{8029}\x{802A}\x{802B}\x{802C}' + . '\x{802D}\x{802E}\x{8030}\x{8031}\x{8032}\x{8033}\x{8034}\x{8035}\x{8036}' + . '\x{8037}\x{8038}\x{8039}\x{803A}\x{803B}\x{803D}\x{803E}\x{803F}\x{8041}' + . '\x{8042}\x{8043}\x{8044}\x{8045}\x{8046}\x{8047}\x{8048}\x{8049}\x{804A}' + . '\x{804B}\x{804C}\x{804D}\x{804E}\x{804F}\x{8050}\x{8051}\x{8052}\x{8053}' + . '\x{8054}\x{8055}\x{8056}\x{8057}\x{8058}\x{8059}\x{805A}\x{805B}\x{805C}' + . '\x{805D}\x{805E}\x{805F}\x{8060}\x{8061}\x{8062}\x{8063}\x{8064}\x{8065}' + . '\x{8067}\x{8068}\x{8069}\x{806A}\x{806B}\x{806C}\x{806D}\x{806E}\x{806F}' + . '\x{8070}\x{8071}\x{8072}\x{8073}\x{8074}\x{8075}\x{8076}\x{8077}\x{8078}' + . '\x{8079}\x{807A}\x{807B}\x{807C}\x{807D}\x{807E}\x{807F}\x{8080}\x{8081}' + . '\x{8082}\x{8083}\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808A}\x{808B}' + . '\x{808C}\x{808D}\x{808F}\x{8090}\x{8091}\x{8092}\x{8093}\x{8095}\x{8096}' + . '\x{8097}\x{8098}\x{8099}\x{809A}\x{809B}\x{809C}\x{809D}\x{809E}\x{809F}' + . '\x{80A0}\x{80A1}\x{80A2}\x{80A3}\x{80A4}\x{80A5}\x{80A9}\x{80AA}\x{80AB}' + . '\x{80AD}\x{80AE}\x{80AF}\x{80B0}\x{80B1}\x{80B2}\x{80B4}\x{80B5}\x{80B6}' + . '\x{80B7}\x{80B8}\x{80BA}\x{80BB}\x{80BC}\x{80BD}\x{80BE}\x{80BF}\x{80C0}' + . '\x{80C1}\x{80C2}\x{80C3}\x{80C4}\x{80C5}\x{80C6}\x{80C7}\x{80C8}\x{80C9}' + . '\x{80CA}\x{80CB}\x{80CC}\x{80CD}\x{80CE}\x{80CF}\x{80D0}\x{80D1}\x{80D2}' + . '\x{80D3}\x{80D4}\x{80D5}\x{80D6}\x{80D7}\x{80D8}\x{80D9}\x{80DA}\x{80DB}' + . '\x{80DC}\x{80DD}\x{80DE}\x{80E0}\x{80E1}\x{80E2}\x{80E3}\x{80E4}\x{80E5}' + . '\x{80E6}\x{80E7}\x{80E8}\x{80E9}\x{80EA}\x{80EB}\x{80EC}\x{80ED}\x{80EE}' + . '\x{80EF}\x{80F0}\x{80F1}\x{80F2}\x{80F3}\x{80F4}\x{80F5}\x{80F6}\x{80F7}' + . '\x{80F8}\x{80F9}\x{80FA}\x{80FB}\x{80FC}\x{80FD}\x{80FE}\x{80FF}\x{8100}' + . '\x{8101}\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{810B}' + . '\x{810C}\x{810D}\x{810E}\x{810F}\x{8110}\x{8111}\x{8112}\x{8113}\x{8114}' + . '\x{8115}\x{8116}\x{8118}\x{8119}\x{811A}\x{811B}\x{811C}\x{811D}\x{811E}' + . '\x{811F}\x{8120}\x{8121}\x{8122}\x{8123}\x{8124}\x{8125}\x{8126}\x{8127}' + . '\x{8128}\x{8129}\x{812A}\x{812B}\x{812C}\x{812D}\x{812E}\x{812F}\x{8130}' + . '\x{8131}\x{8132}\x{8136}\x{8137}\x{8138}\x{8139}\x{813A}\x{813B}\x{813C}' + . '\x{813D}\x{813E}\x{813F}\x{8140}\x{8141}\x{8142}\x{8143}\x{8144}\x{8145}' + . '\x{8146}\x{8147}\x{8148}\x{8149}\x{814A}\x{814B}\x{814C}\x{814D}\x{814E}' + . '\x{814F}\x{8150}\x{8151}\x{8152}\x{8153}\x{8154}\x{8155}\x{8156}\x{8157}' + . '\x{8158}\x{8159}\x{815A}\x{815B}\x{815C}\x{815D}\x{815E}\x{8160}\x{8161}' + . '\x{8162}\x{8163}\x{8164}\x{8165}\x{8166}\x{8167}\x{8168}\x{8169}\x{816A}' + . '\x{816B}\x{816C}\x{816D}\x{816E}\x{816F}\x{8170}\x{8171}\x{8172}\x{8173}' + . '\x{8174}\x{8175}\x{8176}\x{8177}\x{8178}\x{8179}\x{817A}\x{817B}\x{817C}' + . '\x{817D}\x{817E}\x{817F}\x{8180}\x{8181}\x{8182}\x{8183}\x{8185}\x{8186}' + . '\x{8187}\x{8188}\x{8189}\x{818A}\x{818B}\x{818C}\x{818D}\x{818E}\x{818F}' + . '\x{8191}\x{8192}\x{8193}\x{8194}\x{8195}\x{8197}\x{8198}\x{8199}\x{819A}' + . '\x{819B}\x{819C}\x{819D}\x{819E}\x{819F}\x{81A0}\x{81A1}\x{81A2}\x{81A3}' + . '\x{81A4}\x{81A5}\x{81A6}\x{81A7}\x{81A8}\x{81A9}\x{81AA}\x{81AB}\x{81AC}' + . '\x{81AD}\x{81AE}\x{81AF}\x{81B0}\x{81B1}\x{81B2}\x{81B3}\x{81B4}\x{81B5}' + . '\x{81B6}\x{81B7}\x{81B8}\x{81B9}\x{81BA}\x{81BB}\x{81BC}\x{81BD}\x{81BE}' + . '\x{81BF}\x{81C0}\x{81C1}\x{81C2}\x{81C3}\x{81C4}\x{81C5}\x{81C6}\x{81C7}' + . '\x{81C8}\x{81C9}\x{81CA}\x{81CC}\x{81CD}\x{81CE}\x{81CF}\x{81D0}\x{81D1}' + . '\x{81D2}\x{81D4}\x{81D5}\x{81D6}\x{81D7}\x{81D8}\x{81D9}\x{81DA}\x{81DB}' + . '\x{81DC}\x{81DD}\x{81DE}\x{81DF}\x{81E0}\x{81E1}\x{81E2}\x{81E3}\x{81E5}' + . '\x{81E6}\x{81E7}\x{81E8}\x{81E9}\x{81EA}\x{81EB}\x{81EC}\x{81ED}\x{81EE}' + . '\x{81F1}\x{81F2}\x{81F3}\x{81F4}\x{81F5}\x{81F6}\x{81F7}\x{81F8}\x{81F9}' + . '\x{81FA}\x{81FB}\x{81FC}\x{81FD}\x{81FE}\x{81FF}\x{8200}\x{8201}\x{8202}' + . '\x{8203}\x{8204}\x{8205}\x{8206}\x{8207}\x{8208}\x{8209}\x{820A}\x{820B}' + . '\x{820C}\x{820D}\x{820E}\x{820F}\x{8210}\x{8211}\x{8212}\x{8214}\x{8215}' + . '\x{8216}\x{8218}\x{8219}\x{821A}\x{821B}\x{821C}\x{821D}\x{821E}\x{821F}' + . '\x{8220}\x{8221}\x{8222}\x{8223}\x{8225}\x{8226}\x{8227}\x{8228}\x{8229}' + . '\x{822A}\x{822B}\x{822C}\x{822D}\x{822F}\x{8230}\x{8231}\x{8232}\x{8233}' + . '\x{8234}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{823A}\x{823B}\x{823C}' + . '\x{823D}\x{823E}\x{823F}\x{8240}\x{8242}\x{8243}\x{8244}\x{8245}\x{8246}' + . '\x{8247}\x{8248}\x{8249}\x{824A}\x{824B}\x{824C}\x{824D}\x{824E}\x{824F}' + . '\x{8250}\x{8251}\x{8252}\x{8253}\x{8254}\x{8255}\x{8256}\x{8257}\x{8258}' + . '\x{8259}\x{825A}\x{825B}\x{825C}\x{825D}\x{825E}\x{825F}\x{8260}\x{8261}' + . '\x{8263}\x{8264}\x{8266}\x{8267}\x{8268}\x{8269}\x{826A}\x{826B}\x{826C}' + . '\x{826D}\x{826E}\x{826F}\x{8270}\x{8271}\x{8272}\x{8273}\x{8274}\x{8275}' + . '\x{8276}\x{8277}\x{8278}\x{8279}\x{827A}\x{827B}\x{827C}\x{827D}\x{827E}' + . '\x{827F}\x{8280}\x{8281}\x{8282}\x{8283}\x{8284}\x{8285}\x{8286}\x{8287}' + . '\x{8288}\x{8289}\x{828A}\x{828B}\x{828D}\x{828E}\x{828F}\x{8290}\x{8291}' + . '\x{8292}\x{8293}\x{8294}\x{8295}\x{8296}\x{8297}\x{8298}\x{8299}\x{829A}' + . '\x{829B}\x{829C}\x{829D}\x{829E}\x{829F}\x{82A0}\x{82A1}\x{82A2}\x{82A3}' + . '\x{82A4}\x{82A5}\x{82A6}\x{82A7}\x{82A8}\x{82A9}\x{82AA}\x{82AB}\x{82AC}' + . '\x{82AD}\x{82AE}\x{82AF}\x{82B0}\x{82B1}\x{82B3}\x{82B4}\x{82B5}\x{82B6}' + . '\x{82B7}\x{82B8}\x{82B9}\x{82BA}\x{82BB}\x{82BC}\x{82BD}\x{82BE}\x{82BF}' + . '\x{82C0}\x{82C1}\x{82C2}\x{82C3}\x{82C4}\x{82C5}\x{82C6}\x{82C7}\x{82C8}' + . '\x{82C9}\x{82CA}\x{82CB}\x{82CC}\x{82CD}\x{82CE}\x{82CF}\x{82D0}\x{82D1}' + . '\x{82D2}\x{82D3}\x{82D4}\x{82D5}\x{82D6}\x{82D7}\x{82D8}\x{82D9}\x{82DA}' + . '\x{82DB}\x{82DC}\x{82DD}\x{82DE}\x{82DF}\x{82E0}\x{82E1}\x{82E3}\x{82E4}' + . '\x{82E5}\x{82E6}\x{82E7}\x{82E8}\x{82E9}\x{82EA}\x{82EB}\x{82EC}\x{82ED}' + . '\x{82EE}\x{82EF}\x{82F0}\x{82F1}\x{82F2}\x{82F3}\x{82F4}\x{82F5}\x{82F6}' + . '\x{82F7}\x{82F8}\x{82F9}\x{82FA}\x{82FB}\x{82FD}\x{82FE}\x{82FF}\x{8300}' + . '\x{8301}\x{8302}\x{8303}\x{8304}\x{8305}\x{8306}\x{8307}\x{8308}\x{8309}' + . '\x{830B}\x{830C}\x{830D}\x{830E}\x{830F}\x{8311}\x{8312}\x{8313}\x{8314}' + . '\x{8315}\x{8316}\x{8317}\x{8318}\x{8319}\x{831A}\x{831B}\x{831C}\x{831D}' + . '\x{831E}\x{831F}\x{8320}\x{8321}\x{8322}\x{8323}\x{8324}\x{8325}\x{8326}' + . '\x{8327}\x{8328}\x{8329}\x{832A}\x{832B}\x{832C}\x{832D}\x{832E}\x{832F}' + . '\x{8331}\x{8332}\x{8333}\x{8334}\x{8335}\x{8336}\x{8337}\x{8338}\x{8339}' + . '\x{833A}\x{833B}\x{833C}\x{833D}\x{833E}\x{833F}\x{8340}\x{8341}\x{8342}' + . '\x{8343}\x{8344}\x{8345}\x{8346}\x{8347}\x{8348}\x{8349}\x{834A}\x{834B}' + . '\x{834C}\x{834D}\x{834E}\x{834F}\x{8350}\x{8351}\x{8352}\x{8353}\x{8354}' + . '\x{8356}\x{8357}\x{8358}\x{8359}\x{835A}\x{835B}\x{835C}\x{835D}\x{835E}' + . '\x{835F}\x{8360}\x{8361}\x{8362}\x{8363}\x{8364}\x{8365}\x{8366}\x{8367}' + . '\x{8368}\x{8369}\x{836A}\x{836B}\x{836C}\x{836D}\x{836E}\x{836F}\x{8370}' + . '\x{8371}\x{8372}\x{8373}\x{8374}\x{8375}\x{8376}\x{8377}\x{8378}\x{8379}' + . '\x{837A}\x{837B}\x{837C}\x{837D}\x{837E}\x{837F}\x{8380}\x{8381}\x{8382}' + . '\x{8383}\x{8384}\x{8385}\x{8386}\x{8387}\x{8388}\x{8389}\x{838A}\x{838B}' + . '\x{838C}\x{838D}\x{838E}\x{838F}\x{8390}\x{8391}\x{8392}\x{8393}\x{8394}' + . '\x{8395}\x{8396}\x{8397}\x{8398}\x{8399}\x{839A}\x{839B}\x{839C}\x{839D}' + . '\x{839E}\x{83A0}\x{83A1}\x{83A2}\x{83A3}\x{83A4}\x{83A5}\x{83A6}\x{83A7}' + . '\x{83A8}\x{83A9}\x{83AA}\x{83AB}\x{83AC}\x{83AD}\x{83AE}\x{83AF}\x{83B0}' + . '\x{83B1}\x{83B2}\x{83B3}\x{83B4}\x{83B6}\x{83B7}\x{83B8}\x{83B9}\x{83BA}' + . '\x{83BB}\x{83BC}\x{83BD}\x{83BF}\x{83C0}\x{83C1}\x{83C2}\x{83C3}\x{83C4}' + . '\x{83C5}\x{83C6}\x{83C7}\x{83C8}\x{83C9}\x{83CA}\x{83CB}\x{83CC}\x{83CD}' + . '\x{83CE}\x{83CF}\x{83D0}\x{83D1}\x{83D2}\x{83D3}\x{83D4}\x{83D5}\x{83D6}' + . '\x{83D7}\x{83D8}\x{83D9}\x{83DA}\x{83DB}\x{83DC}\x{83DD}\x{83DE}\x{83DF}' + . '\x{83E0}\x{83E1}\x{83E2}\x{83E3}\x{83E4}\x{83E5}\x{83E7}\x{83E8}\x{83E9}' + . '\x{83EA}\x{83EB}\x{83EC}\x{83EE}\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F3}' + . '\x{83F4}\x{83F5}\x{83F6}\x{83F7}\x{83F8}\x{83F9}\x{83FA}\x{83FB}\x{83FC}' + . '\x{83FD}\x{83FE}\x{83FF}\x{8400}\x{8401}\x{8402}\x{8403}\x{8404}\x{8405}' + . '\x{8406}\x{8407}\x{8408}\x{8409}\x{840A}\x{840B}\x{840C}\x{840D}\x{840E}' + . '\x{840F}\x{8410}\x{8411}\x{8412}\x{8413}\x{8415}\x{8418}\x{8419}\x{841A}' + . '\x{841B}\x{841C}\x{841D}\x{841E}\x{8421}\x{8422}\x{8423}\x{8424}\x{8425}' + . '\x{8426}\x{8427}\x{8428}\x{8429}\x{842A}\x{842B}\x{842C}\x{842D}\x{842E}' + . '\x{842F}\x{8430}\x{8431}\x{8432}\x{8433}\x{8434}\x{8435}\x{8436}\x{8437}' + . '\x{8438}\x{8439}\x{843A}\x{843B}\x{843C}\x{843D}\x{843E}\x{843F}\x{8440}' + . '\x{8441}\x{8442}\x{8443}\x{8444}\x{8445}\x{8446}\x{8447}\x{8448}\x{8449}' + . '\x{844A}\x{844B}\x{844C}\x{844D}\x{844E}\x{844F}\x{8450}\x{8451}\x{8452}' + . '\x{8453}\x{8454}\x{8455}\x{8456}\x{8457}\x{8459}\x{845A}\x{845B}\x{845C}' + . '\x{845D}\x{845E}\x{845F}\x{8460}\x{8461}\x{8462}\x{8463}\x{8464}\x{8465}' + . '\x{8466}\x{8467}\x{8468}\x{8469}\x{846A}\x{846B}\x{846C}\x{846D}\x{846E}' + . '\x{846F}\x{8470}\x{8471}\x{8472}\x{8473}\x{8474}\x{8475}\x{8476}\x{8477}' + . '\x{8478}\x{8479}\x{847A}\x{847B}\x{847C}\x{847D}\x{847E}\x{847F}\x{8480}' + . '\x{8481}\x{8482}\x{8484}\x{8485}\x{8486}\x{8487}\x{8488}\x{8489}\x{848A}' + . '\x{848B}\x{848C}\x{848D}\x{848E}\x{848F}\x{8490}\x{8491}\x{8492}\x{8493}' + . '\x{8494}\x{8496}\x{8497}\x{8498}\x{8499}\x{849A}\x{849B}\x{849C}\x{849D}' + . '\x{849E}\x{849F}\x{84A0}\x{84A1}\x{84A2}\x{84A3}\x{84A4}\x{84A5}\x{84A6}' + . '\x{84A7}\x{84A8}\x{84A9}\x{84AA}\x{84AB}\x{84AC}\x{84AE}\x{84AF}\x{84B0}' + . '\x{84B1}\x{84B2}\x{84B3}\x{84B4}\x{84B5}\x{84B6}\x{84B8}\x{84B9}\x{84BA}' + . '\x{84BB}\x{84BC}\x{84BD}\x{84BE}\x{84BF}\x{84C0}\x{84C1}\x{84C2}\x{84C4}' + . '\x{84C5}\x{84C6}\x{84C7}\x{84C8}\x{84C9}\x{84CA}\x{84CB}\x{84CC}\x{84CD}' + . '\x{84CE}\x{84CF}\x{84D0}\x{84D1}\x{84D2}\x{84D3}\x{84D4}\x{84D5}\x{84D6}' + . '\x{84D7}\x{84D8}\x{84D9}\x{84DB}\x{84DC}\x{84DD}\x{84DE}\x{84DF}\x{84E0}' + . '\x{84E1}\x{84E2}\x{84E3}\x{84E4}\x{84E5}\x{84E6}\x{84E7}\x{84E8}\x{84E9}' + . '\x{84EA}\x{84EB}\x{84EC}\x{84EE}\x{84EF}\x{84F0}\x{84F1}\x{84F2}\x{84F3}' + . '\x{84F4}\x{84F5}\x{84F6}\x{84F7}\x{84F8}\x{84F9}\x{84FA}\x{84FB}\x{84FC}' + . '\x{84FD}\x{84FE}\x{84FF}\x{8500}\x{8501}\x{8502}\x{8503}\x{8504}\x{8506}' + . '\x{8507}\x{8508}\x{8509}\x{850A}\x{850B}\x{850C}\x{850D}\x{850E}\x{850F}' + . '\x{8511}\x{8512}\x{8513}\x{8514}\x{8515}\x{8516}\x{8517}\x{8518}\x{8519}' + . '\x{851A}\x{851B}\x{851C}\x{851D}\x{851E}\x{851F}\x{8520}\x{8521}\x{8522}' + . '\x{8523}\x{8524}\x{8525}\x{8526}\x{8527}\x{8528}\x{8529}\x{852A}\x{852B}' + . '\x{852C}\x{852D}\x{852E}\x{852F}\x{8530}\x{8531}\x{8534}\x{8535}\x{8536}' + . '\x{8537}\x{8538}\x{8539}\x{853A}\x{853B}\x{853C}\x{853D}\x{853E}\x{853F}' + . '\x{8540}\x{8541}\x{8542}\x{8543}\x{8544}\x{8545}\x{8546}\x{8547}\x{8548}' + . '\x{8549}\x{854A}\x{854B}\x{854D}\x{854E}\x{854F}\x{8551}\x{8552}\x{8553}' + . '\x{8554}\x{8555}\x{8556}\x{8557}\x{8558}\x{8559}\x{855A}\x{855B}\x{855C}' + . '\x{855D}\x{855E}\x{855F}\x{8560}\x{8561}\x{8562}\x{8563}\x{8564}\x{8565}' + . '\x{8566}\x{8567}\x{8568}\x{8569}\x{856A}\x{856B}\x{856C}\x{856D}\x{856E}' + . '\x{856F}\x{8570}\x{8571}\x{8572}\x{8573}\x{8574}\x{8575}\x{8576}\x{8577}' + . '\x{8578}\x{8579}\x{857A}\x{857B}\x{857C}\x{857D}\x{857E}\x{8580}\x{8581}' + . '\x{8582}\x{8583}\x{8584}\x{8585}\x{8586}\x{8587}\x{8588}\x{8589}\x{858A}' + . '\x{858B}\x{858C}\x{858D}\x{858E}\x{858F}\x{8590}\x{8591}\x{8592}\x{8594}' + . '\x{8595}\x{8596}\x{8598}\x{8599}\x{859A}\x{859B}\x{859C}\x{859D}\x{859E}' + . '\x{859F}\x{85A0}\x{85A1}\x{85A2}\x{85A3}\x{85A4}\x{85A5}\x{85A6}\x{85A7}' + . '\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AD}\x{85AE}\x{85AF}\x{85B0}' + . '\x{85B1}\x{85B3}\x{85B4}\x{85B5}\x{85B6}\x{85B7}\x{85B8}\x{85B9}\x{85BA}' + . '\x{85BC}\x{85BD}\x{85BE}\x{85BF}\x{85C0}\x{85C1}\x{85C2}\x{85C3}\x{85C4}' + . '\x{85C5}\x{85C6}\x{85C7}\x{85C8}\x{85C9}\x{85CA}\x{85CB}\x{85CD}\x{85CE}' + . '\x{85CF}\x{85D0}\x{85D1}\x{85D2}\x{85D3}\x{85D4}\x{85D5}\x{85D6}\x{85D7}' + . '\x{85D8}\x{85D9}\x{85DA}\x{85DB}\x{85DC}\x{85DD}\x{85DE}\x{85DF}\x{85E0}' + . '\x{85E1}\x{85E2}\x{85E3}\x{85E4}\x{85E5}\x{85E6}\x{85E7}\x{85E8}\x{85E9}' + . '\x{85EA}\x{85EB}\x{85EC}\x{85ED}\x{85EF}\x{85F0}\x{85F1}\x{85F2}\x{85F4}' + . '\x{85F5}\x{85F6}\x{85F7}\x{85F8}\x{85F9}\x{85FA}\x{85FB}\x{85FD}\x{85FE}' + . '\x{85FF}\x{8600}\x{8601}\x{8602}\x{8604}\x{8605}\x{8606}\x{8607}\x{8608}' + . '\x{8609}\x{860A}\x{860B}\x{860C}\x{860F}\x{8611}\x{8612}\x{8613}\x{8614}' + . '\x{8616}\x{8617}\x{8618}\x{8619}\x{861A}\x{861B}\x{861C}\x{861E}\x{861F}' + . '\x{8620}\x{8621}\x{8622}\x{8623}\x{8624}\x{8625}\x{8626}\x{8627}\x{8628}' + . '\x{8629}\x{862A}\x{862B}\x{862C}\x{862D}\x{862E}\x{862F}\x{8630}\x{8631}' + . '\x{8632}\x{8633}\x{8634}\x{8635}\x{8636}\x{8638}\x{8639}\x{863A}\x{863B}' + . '\x{863C}\x{863D}\x{863E}\x{863F}\x{8640}\x{8641}\x{8642}\x{8643}\x{8644}' + . '\x{8645}\x{8646}\x{8647}\x{8648}\x{8649}\x{864A}\x{864B}\x{864C}\x{864D}' + . '\x{864E}\x{864F}\x{8650}\x{8651}\x{8652}\x{8653}\x{8654}\x{8655}\x{8656}' + . '\x{8658}\x{8659}\x{865A}\x{865B}\x{865C}\x{865D}\x{865E}\x{865F}\x{8660}' + . '\x{8661}\x{8662}\x{8663}\x{8664}\x{8665}\x{8666}\x{8667}\x{8668}\x{8669}' + . '\x{866A}\x{866B}\x{866C}\x{866D}\x{866E}\x{866F}\x{8670}\x{8671}\x{8672}' + . '\x{8673}\x{8674}\x{8676}\x{8677}\x{8678}\x{8679}\x{867A}\x{867B}\x{867C}' + . '\x{867D}\x{867E}\x{867F}\x{8680}\x{8681}\x{8682}\x{8683}\x{8684}\x{8685}' + . '\x{8686}\x{8687}\x{8688}\x{868A}\x{868B}\x{868C}\x{868D}\x{868E}\x{868F}' + . '\x{8690}\x{8691}\x{8693}\x{8694}\x{8695}\x{8696}\x{8697}\x{8698}\x{8699}' + . '\x{869A}\x{869B}\x{869C}\x{869D}\x{869E}\x{869F}\x{86A1}\x{86A2}\x{86A3}' + . '\x{86A4}\x{86A5}\x{86A7}\x{86A8}\x{86A9}\x{86AA}\x{86AB}\x{86AC}\x{86AD}' + . '\x{86AE}\x{86AF}\x{86B0}\x{86B1}\x{86B2}\x{86B3}\x{86B4}\x{86B5}\x{86B6}' + . '\x{86B7}\x{86B8}\x{86B9}\x{86BA}\x{86BB}\x{86BC}\x{86BD}\x{86BE}\x{86BF}' + . '\x{86C0}\x{86C1}\x{86C2}\x{86C3}\x{86C4}\x{86C5}\x{86C6}\x{86C7}\x{86C8}' + . '\x{86C9}\x{86CA}\x{86CB}\x{86CC}\x{86CE}\x{86CF}\x{86D0}\x{86D1}\x{86D2}' + . '\x{86D3}\x{86D4}\x{86D6}\x{86D7}\x{86D8}\x{86D9}\x{86DA}\x{86DB}\x{86DC}' + . '\x{86DD}\x{86DE}\x{86DF}\x{86E1}\x{86E2}\x{86E3}\x{86E4}\x{86E5}\x{86E6}' + . '\x{86E8}\x{86E9}\x{86EA}\x{86EB}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F0}' + . '\x{86F1}\x{86F2}\x{86F3}\x{86F4}\x{86F5}\x{86F6}\x{86F7}\x{86F8}\x{86F9}' + . '\x{86FA}\x{86FB}\x{86FC}\x{86FE}\x{86FF}\x{8700}\x{8701}\x{8702}\x{8703}' + . '\x{8704}\x{8705}\x{8706}\x{8707}\x{8708}\x{8709}\x{870A}\x{870B}\x{870C}' + . '\x{870D}\x{870E}\x{870F}\x{8710}\x{8711}\x{8712}\x{8713}\x{8714}\x{8715}' + . '\x{8716}\x{8717}\x{8718}\x{8719}\x{871A}\x{871B}\x{871C}\x{871E}\x{871F}' + . '\x{8720}\x{8721}\x{8722}\x{8723}\x{8724}\x{8725}\x{8726}\x{8727}\x{8728}' + . '\x{8729}\x{872A}\x{872B}\x{872C}\x{872D}\x{872E}\x{8730}\x{8731}\x{8732}' + . '\x{8733}\x{8734}\x{8735}\x{8736}\x{8737}\x{8738}\x{8739}\x{873A}\x{873B}' + . '\x{873C}\x{873E}\x{873F}\x{8740}\x{8741}\x{8742}\x{8743}\x{8744}\x{8746}' + . '\x{8747}\x{8748}\x{8749}\x{874A}\x{874C}\x{874D}\x{874E}\x{874F}\x{8750}' + . '\x{8751}\x{8752}\x{8753}\x{8754}\x{8755}\x{8756}\x{8757}\x{8758}\x{8759}' + . '\x{875A}\x{875B}\x{875C}\x{875D}\x{875E}\x{875F}\x{8760}\x{8761}\x{8762}' + . '\x{8763}\x{8764}\x{8765}\x{8766}\x{8767}\x{8768}\x{8769}\x{876A}\x{876B}' + . '\x{876C}\x{876D}\x{876E}\x{876F}\x{8770}\x{8772}\x{8773}\x{8774}\x{8775}' + . '\x{8776}\x{8777}\x{8778}\x{8779}\x{877A}\x{877B}\x{877C}\x{877D}\x{877E}' + . '\x{8780}\x{8781}\x{8782}\x{8783}\x{8784}\x{8785}\x{8786}\x{8787}\x{8788}' + . '\x{8789}\x{878A}\x{878B}\x{878C}\x{878D}\x{878F}\x{8790}\x{8791}\x{8792}' + . '\x{8793}\x{8794}\x{8795}\x{8796}\x{8797}\x{8798}\x{879A}\x{879B}\x{879C}' + . '\x{879D}\x{879E}\x{879F}\x{87A0}\x{87A1}\x{87A2}\x{87A3}\x{87A4}\x{87A5}' + . '\x{87A6}\x{87A7}\x{87A8}\x{87A9}\x{87AA}\x{87AB}\x{87AC}\x{87AD}\x{87AE}' + . '\x{87AF}\x{87B0}\x{87B1}\x{87B2}\x{87B3}\x{87B4}\x{87B5}\x{87B6}\x{87B7}' + . '\x{87B8}\x{87B9}\x{87BA}\x{87BB}\x{87BC}\x{87BD}\x{87BE}\x{87BF}\x{87C0}' + . '\x{87C1}\x{87C2}\x{87C3}\x{87C4}\x{87C5}\x{87C6}\x{87C7}\x{87C8}\x{87C9}' + . '\x{87CA}\x{87CB}\x{87CC}\x{87CD}\x{87CE}\x{87CF}\x{87D0}\x{87D1}\x{87D2}' + . '\x{87D3}\x{87D4}\x{87D5}\x{87D6}\x{87D7}\x{87D8}\x{87D9}\x{87DB}\x{87DC}' + . '\x{87DD}\x{87DE}\x{87DF}\x{87E0}\x{87E1}\x{87E2}\x{87E3}\x{87E4}\x{87E5}' + . '\x{87E6}\x{87E7}\x{87E8}\x{87E9}\x{87EA}\x{87EB}\x{87EC}\x{87ED}\x{87EE}' + . '\x{87EF}\x{87F1}\x{87F2}\x{87F3}\x{87F4}\x{87F5}\x{87F6}\x{87F7}\x{87F8}' + . '\x{87F9}\x{87FA}\x{87FB}\x{87FC}\x{87FD}\x{87FE}\x{87FF}\x{8800}\x{8801}' + . '\x{8802}\x{8803}\x{8804}\x{8805}\x{8806}\x{8808}\x{8809}\x{880A}\x{880B}' + . '\x{880C}\x{880D}\x{880E}\x{880F}\x{8810}\x{8811}\x{8813}\x{8814}\x{8815}' + . '\x{8816}\x{8817}\x{8818}\x{8819}\x{881A}\x{881B}\x{881C}\x{881D}\x{881E}' + . '\x{881F}\x{8820}\x{8821}\x{8822}\x{8823}\x{8824}\x{8825}\x{8826}\x{8827}' + . '\x{8828}\x{8829}\x{882A}\x{882B}\x{882C}\x{882E}\x{882F}\x{8830}\x{8831}' + . '\x{8832}\x{8833}\x{8834}\x{8835}\x{8836}\x{8837}\x{8838}\x{8839}\x{883B}' + . '\x{883C}\x{883D}\x{883E}\x{883F}\x{8840}\x{8841}\x{8842}\x{8843}\x{8844}' + . '\x{8845}\x{8846}\x{8848}\x{8849}\x{884A}\x{884B}\x{884C}\x{884D}\x{884E}' + . '\x{884F}\x{8850}\x{8851}\x{8852}\x{8853}\x{8854}\x{8855}\x{8856}\x{8857}' + . '\x{8859}\x{885A}\x{885B}\x{885D}\x{885E}\x{8860}\x{8861}\x{8862}\x{8863}' + . '\x{8864}\x{8865}\x{8866}\x{8867}\x{8868}\x{8869}\x{886A}\x{886B}\x{886C}' + . '\x{886D}\x{886E}\x{886F}\x{8870}\x{8871}\x{8872}\x{8873}\x{8874}\x{8875}' + . '\x{8876}\x{8877}\x{8878}\x{8879}\x{887B}\x{887C}\x{887D}\x{887E}\x{887F}' + . '\x{8880}\x{8881}\x{8882}\x{8883}\x{8884}\x{8885}\x{8886}\x{8887}\x{8888}' + . '\x{8889}\x{888A}\x{888B}\x{888C}\x{888D}\x{888E}\x{888F}\x{8890}\x{8891}' + . '\x{8892}\x{8893}\x{8894}\x{8895}\x{8896}\x{8897}\x{8898}\x{8899}\x{889A}' + . '\x{889B}\x{889C}\x{889D}\x{889E}\x{889F}\x{88A0}\x{88A1}\x{88A2}\x{88A3}' + . '\x{88A4}\x{88A5}\x{88A6}\x{88A7}\x{88A8}\x{88A9}\x{88AA}\x{88AB}\x{88AC}' + . '\x{88AD}\x{88AE}\x{88AF}\x{88B0}\x{88B1}\x{88B2}\x{88B3}\x{88B4}\x{88B6}' + . '\x{88B7}\x{88B8}\x{88B9}\x{88BA}\x{88BB}\x{88BC}\x{88BD}\x{88BE}\x{88BF}' + . '\x{88C0}\x{88C1}\x{88C2}\x{88C3}\x{88C4}\x{88C5}\x{88C6}\x{88C7}\x{88C8}' + . '\x{88C9}\x{88CA}\x{88CB}\x{88CC}\x{88CD}\x{88CE}\x{88CF}\x{88D0}\x{88D1}' + . '\x{88D2}\x{88D3}\x{88D4}\x{88D5}\x{88D6}\x{88D7}\x{88D8}\x{88D9}\x{88DA}' + . '\x{88DB}\x{88DC}\x{88DD}\x{88DE}\x{88DF}\x{88E0}\x{88E1}\x{88E2}\x{88E3}' + . '\x{88E4}\x{88E5}\x{88E7}\x{88E8}\x{88EA}\x{88EB}\x{88EC}\x{88EE}\x{88EF}' + . '\x{88F0}\x{88F1}\x{88F2}\x{88F3}\x{88F4}\x{88F5}\x{88F6}\x{88F7}\x{88F8}' + . '\x{88F9}\x{88FA}\x{88FB}\x{88FC}\x{88FD}\x{88FE}\x{88FF}\x{8900}\x{8901}' + . '\x{8902}\x{8904}\x{8905}\x{8906}\x{8907}\x{8908}\x{8909}\x{890A}\x{890B}' + . '\x{890C}\x{890D}\x{890E}\x{8910}\x{8911}\x{8912}\x{8913}\x{8914}\x{8915}' + . '\x{8916}\x{8917}\x{8918}\x{8919}\x{891A}\x{891B}\x{891C}\x{891D}\x{891E}' + . '\x{891F}\x{8920}\x{8921}\x{8922}\x{8923}\x{8925}\x{8926}\x{8927}\x{8928}' + . '\x{8929}\x{892A}\x{892B}\x{892C}\x{892D}\x{892E}\x{892F}\x{8930}\x{8931}' + . '\x{8932}\x{8933}\x{8934}\x{8935}\x{8936}\x{8937}\x{8938}\x{8939}\x{893A}' + . '\x{893B}\x{893C}\x{893D}\x{893E}\x{893F}\x{8940}\x{8941}\x{8942}\x{8943}' + . '\x{8944}\x{8945}\x{8946}\x{8947}\x{8948}\x{8949}\x{894A}\x{894B}\x{894C}' + . '\x{894E}\x{894F}\x{8950}\x{8951}\x{8952}\x{8953}\x{8954}\x{8955}\x{8956}' + . '\x{8957}\x{8958}\x{8959}\x{895A}\x{895B}\x{895C}\x{895D}\x{895E}\x{895F}' + . '\x{8960}\x{8961}\x{8962}\x{8963}\x{8964}\x{8966}\x{8967}\x{8968}\x{8969}' + . '\x{896A}\x{896B}\x{896C}\x{896D}\x{896E}\x{896F}\x{8970}\x{8971}\x{8972}' + . '\x{8973}\x{8974}\x{8976}\x{8977}\x{8978}\x{8979}\x{897A}\x{897B}\x{897C}' + . '\x{897E}\x{897F}\x{8980}\x{8981}\x{8982}\x{8983}\x{8984}\x{8985}\x{8986}' + . '\x{8987}\x{8988}\x{8989}\x{898A}\x{898B}\x{898C}\x{898E}\x{898F}\x{8991}' + . '\x{8992}\x{8993}\x{8995}\x{8996}\x{8997}\x{8998}\x{899A}\x{899B}\x{899C}' + . '\x{899D}\x{899E}\x{899F}\x{89A0}\x{89A1}\x{89A2}\x{89A3}\x{89A4}\x{89A5}' + . '\x{89A6}\x{89A7}\x{89A8}\x{89AA}\x{89AB}\x{89AC}\x{89AD}\x{89AE}\x{89AF}' + . '\x{89B1}\x{89B2}\x{89B3}\x{89B5}\x{89B6}\x{89B7}\x{89B8}\x{89B9}\x{89BA}' + . '\x{89BD}\x{89BE}\x{89BF}\x{89C0}\x{89C1}\x{89C2}\x{89C3}\x{89C4}\x{89C5}' + . '\x{89C6}\x{89C7}\x{89C8}\x{89C9}\x{89CA}\x{89CB}\x{89CC}\x{89CD}\x{89CE}' + . '\x{89CF}\x{89D0}\x{89D1}\x{89D2}\x{89D3}\x{89D4}\x{89D5}\x{89D6}\x{89D7}' + . '\x{89D8}\x{89D9}\x{89DA}\x{89DB}\x{89DC}\x{89DD}\x{89DE}\x{89DF}\x{89E0}' + . '\x{89E1}\x{89E2}\x{89E3}\x{89E4}\x{89E5}\x{89E6}\x{89E7}\x{89E8}\x{89E9}' + . '\x{89EA}\x{89EB}\x{89EC}\x{89ED}\x{89EF}\x{89F0}\x{89F1}\x{89F2}\x{89F3}' + . '\x{89F4}\x{89F6}\x{89F7}\x{89F8}\x{89FA}\x{89FB}\x{89FC}\x{89FE}\x{89FF}' + . '\x{8A00}\x{8A01}\x{8A02}\x{8A03}\x{8A04}\x{8A07}\x{8A08}\x{8A09}\x{8A0A}' + . '\x{8A0B}\x{8A0C}\x{8A0D}\x{8A0E}\x{8A0F}\x{8A10}\x{8A11}\x{8A12}\x{8A13}' + . '\x{8A15}\x{8A16}\x{8A17}\x{8A18}\x{8A1A}\x{8A1B}\x{8A1C}\x{8A1D}\x{8A1E}' + . '\x{8A1F}\x{8A22}\x{8A23}\x{8A24}\x{8A25}\x{8A26}\x{8A27}\x{8A28}\x{8A29}' + . '\x{8A2A}\x{8A2C}\x{8A2D}\x{8A2E}\x{8A2F}\x{8A30}\x{8A31}\x{8A32}\x{8A34}' + . '\x{8A35}\x{8A36}\x{8A37}\x{8A38}\x{8A39}\x{8A3A}\x{8A3B}\x{8A3C}\x{8A3E}' + . '\x{8A3F}\x{8A40}\x{8A41}\x{8A42}\x{8A43}\x{8A44}\x{8A45}\x{8A46}\x{8A47}' + . '\x{8A48}\x{8A49}\x{8A4A}\x{8A4C}\x{8A4D}\x{8A4E}\x{8A4F}\x{8A50}\x{8A51}' + . '\x{8A52}\x{8A53}\x{8A54}\x{8A55}\x{8A56}\x{8A57}\x{8A58}\x{8A59}\x{8A5A}' + . '\x{8A5B}\x{8A5C}\x{8A5D}\x{8A5E}\x{8A5F}\x{8A60}\x{8A61}\x{8A62}\x{8A63}' + . '\x{8A65}\x{8A66}\x{8A67}\x{8A68}\x{8A69}\x{8A6A}\x{8A6B}\x{8A6C}\x{8A6D}' + . '\x{8A6E}\x{8A6F}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A74}\x{8A75}\x{8A76}' + . '\x{8A77}\x{8A79}\x{8A7A}\x{8A7B}\x{8A7C}\x{8A7E}\x{8A7F}\x{8A80}\x{8A81}' + . '\x{8A82}\x{8A83}\x{8A84}\x{8A85}\x{8A86}\x{8A87}\x{8A89}\x{8A8A}\x{8A8B}' + . '\x{8A8C}\x{8A8D}\x{8A8E}\x{8A8F}\x{8A90}\x{8A91}\x{8A92}\x{8A93}\x{8A94}' + . '\x{8A95}\x{8A96}\x{8A97}\x{8A98}\x{8A99}\x{8A9A}\x{8A9B}\x{8A9C}\x{8A9D}' + . '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA2}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA7}' + . '\x{8AA8}\x{8AA9}\x{8AAA}\x{8AAB}\x{8AAC}\x{8AAE}\x{8AB0}\x{8AB1}\x{8AB2}' + . '\x{8AB3}\x{8AB4}\x{8AB5}\x{8AB6}\x{8AB8}\x{8AB9}\x{8ABA}\x{8ABB}\x{8ABC}' + . '\x{8ABD}\x{8ABE}\x{8ABF}\x{8AC0}\x{8AC1}\x{8AC2}\x{8AC3}\x{8AC4}\x{8AC5}' + . '\x{8AC6}\x{8AC7}\x{8AC8}\x{8AC9}\x{8ACA}\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACE}' + . '\x{8ACF}\x{8AD1}\x{8AD2}\x{8AD3}\x{8AD4}\x{8AD5}\x{8AD6}\x{8AD7}\x{8AD8}' + . '\x{8AD9}\x{8ADA}\x{8ADB}\x{8ADC}\x{8ADD}\x{8ADE}\x{8ADF}\x{8AE0}\x{8AE1}' + . '\x{8AE2}\x{8AE3}\x{8AE4}\x{8AE5}\x{8AE6}\x{8AE7}\x{8AE8}\x{8AE9}\x{8AEA}' + . '\x{8AEB}\x{8AED}\x{8AEE}\x{8AEF}\x{8AF0}\x{8AF1}\x{8AF2}\x{8AF3}\x{8AF4}' + . '\x{8AF5}\x{8AF6}\x{8AF7}\x{8AF8}\x{8AF9}\x{8AFA}\x{8AFB}\x{8AFC}\x{8AFD}' + . '\x{8AFE}\x{8AFF}\x{8B00}\x{8B01}\x{8B02}\x{8B03}\x{8B04}\x{8B05}\x{8B06}' + . '\x{8B07}\x{8B08}\x{8B09}\x{8B0A}\x{8B0B}\x{8B0D}\x{8B0E}\x{8B0F}\x{8B10}' + . '\x{8B11}\x{8B12}\x{8B13}\x{8B14}\x{8B15}\x{8B16}\x{8B17}\x{8B18}\x{8B19}' + . '\x{8B1A}\x{8B1B}\x{8B1C}\x{8B1D}\x{8B1E}\x{8B1F}\x{8B20}\x{8B21}\x{8B22}' + . '\x{8B23}\x{8B24}\x{8B25}\x{8B26}\x{8B27}\x{8B28}\x{8B2A}\x{8B2B}\x{8B2C}' + . '\x{8B2D}\x{8B2E}\x{8B2F}\x{8B30}\x{8B31}\x{8B33}\x{8B34}\x{8B35}\x{8B36}' + . '\x{8B37}\x{8B39}\x{8B3A}\x{8B3B}\x{8B3C}\x{8B3D}\x{8B3E}\x{8B40}\x{8B41}' + . '\x{8B42}\x{8B43}\x{8B44}\x{8B45}\x{8B46}\x{8B47}\x{8B48}\x{8B49}\x{8B4A}' + . '\x{8B4B}\x{8B4C}\x{8B4D}\x{8B4E}\x{8B4F}\x{8B50}\x{8B51}\x{8B52}\x{8B53}' + . '\x{8B54}\x{8B55}\x{8B56}\x{8B57}\x{8B58}\x{8B59}\x{8B5A}\x{8B5B}\x{8B5C}' + . '\x{8B5D}\x{8B5E}\x{8B5F}\x{8B60}\x{8B63}\x{8B64}\x{8B65}\x{8B66}\x{8B67}' + . '\x{8B68}\x{8B6A}\x{8B6B}\x{8B6C}\x{8B6D}\x{8B6E}\x{8B6F}\x{8B70}\x{8B71}' + . '\x{8B73}\x{8B74}\x{8B76}\x{8B77}\x{8B78}\x{8B79}\x{8B7A}\x{8B7B}\x{8B7D}' + . '\x{8B7E}\x{8B7F}\x{8B80}\x{8B82}\x{8B83}\x{8B84}\x{8B85}\x{8B86}\x{8B88}' + . '\x{8B89}\x{8B8A}\x{8B8B}\x{8B8C}\x{8B8E}\x{8B90}\x{8B91}\x{8B92}\x{8B93}' + . '\x{8B94}\x{8B95}\x{8B96}\x{8B97}\x{8B98}\x{8B99}\x{8B9A}\x{8B9C}\x{8B9D}' + . '\x{8B9E}\x{8B9F}\x{8BA0}\x{8BA1}\x{8BA2}\x{8BA3}\x{8BA4}\x{8BA5}\x{8BA6}' + . '\x{8BA7}\x{8BA8}\x{8BA9}\x{8BAA}\x{8BAB}\x{8BAC}\x{8BAD}\x{8BAE}\x{8BAF}' + . '\x{8BB0}\x{8BB1}\x{8BB2}\x{8BB3}\x{8BB4}\x{8BB5}\x{8BB6}\x{8BB7}\x{8BB8}' + . '\x{8BB9}\x{8BBA}\x{8BBB}\x{8BBC}\x{8BBD}\x{8BBE}\x{8BBF}\x{8BC0}\x{8BC1}' + . '\x{8BC2}\x{8BC3}\x{8BC4}\x{8BC5}\x{8BC6}\x{8BC7}\x{8BC8}\x{8BC9}\x{8BCA}' + . '\x{8BCB}\x{8BCC}\x{8BCD}\x{8BCE}\x{8BCF}\x{8BD0}\x{8BD1}\x{8BD2}\x{8BD3}' + . '\x{8BD4}\x{8BD5}\x{8BD6}\x{8BD7}\x{8BD8}\x{8BD9}\x{8BDA}\x{8BDB}\x{8BDC}' + . '\x{8BDD}\x{8BDE}\x{8BDF}\x{8BE0}\x{8BE1}\x{8BE2}\x{8BE3}\x{8BE4}\x{8BE5}' + . '\x{8BE6}\x{8BE7}\x{8BE8}\x{8BE9}\x{8BEA}\x{8BEB}\x{8BEC}\x{8BED}\x{8BEE}' + . '\x{8BEF}\x{8BF0}\x{8BF1}\x{8BF2}\x{8BF3}\x{8BF4}\x{8BF5}\x{8BF6}\x{8BF7}' + . '\x{8BF8}\x{8BF9}\x{8BFA}\x{8BFB}\x{8BFC}\x{8BFD}\x{8BFE}\x{8BFF}\x{8C00}' + . '\x{8C01}\x{8C02}\x{8C03}\x{8C04}\x{8C05}\x{8C06}\x{8C07}\x{8C08}\x{8C09}' + . '\x{8C0A}\x{8C0B}\x{8C0C}\x{8C0D}\x{8C0E}\x{8C0F}\x{8C10}\x{8C11}\x{8C12}' + . '\x{8C13}\x{8C14}\x{8C15}\x{8C16}\x{8C17}\x{8C18}\x{8C19}\x{8C1A}\x{8C1B}' + . '\x{8C1C}\x{8C1D}\x{8C1E}\x{8C1F}\x{8C20}\x{8C21}\x{8C22}\x{8C23}\x{8C24}' + . '\x{8C25}\x{8C26}\x{8C27}\x{8C28}\x{8C29}\x{8C2A}\x{8C2B}\x{8C2C}\x{8C2D}' + . '\x{8C2E}\x{8C2F}\x{8C30}\x{8C31}\x{8C32}\x{8C33}\x{8C34}\x{8C35}\x{8C36}' + . '\x{8C37}\x{8C39}\x{8C3A}\x{8C3B}\x{8C3C}\x{8C3D}\x{8C3E}\x{8C3F}\x{8C41}' + . '\x{8C42}\x{8C43}\x{8C45}\x{8C46}\x{8C47}\x{8C48}\x{8C49}\x{8C4A}\x{8C4B}' + . '\x{8C4C}\x{8C4D}\x{8C4E}\x{8C4F}\x{8C50}\x{8C54}\x{8C55}\x{8C56}\x{8C57}' + . '\x{8C59}\x{8C5A}\x{8C5B}\x{8C5C}\x{8C5D}\x{8C5E}\x{8C5F}\x{8C60}\x{8C61}' + . '\x{8C62}\x{8C63}\x{8C64}\x{8C65}\x{8C66}\x{8C67}\x{8C68}\x{8C69}\x{8C6A}' + . '\x{8C6B}\x{8C6C}\x{8C6D}\x{8C6E}\x{8C6F}\x{8C70}\x{8C71}\x{8C72}\x{8C73}' + . '\x{8C75}\x{8C76}\x{8C77}\x{8C78}\x{8C79}\x{8C7A}\x{8C7B}\x{8C7D}\x{8C7E}' + . '\x{8C80}\x{8C81}\x{8C82}\x{8C84}\x{8C85}\x{8C86}\x{8C88}\x{8C89}\x{8C8A}' + . '\x{8C8C}\x{8C8D}\x{8C8F}\x{8C90}\x{8C91}\x{8C92}\x{8C93}\x{8C94}\x{8C95}' + . '\x{8C96}\x{8C97}\x{8C98}\x{8C99}\x{8C9A}\x{8C9C}\x{8C9D}\x{8C9E}\x{8C9F}' + . '\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA3}\x{8CA4}\x{8CA5}\x{8CA7}\x{8CA8}\x{8CA9}' + . '\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}\x{8CB1}\x{8CB2}' + . '\x{8CB3}\x{8CB4}\x{8CB5}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CB9}\x{8CBA}\x{8CBB}' + . '\x{8CBC}\x{8CBD}\x{8CBE}\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}' + . '\x{8CC5}\x{8CC6}\x{8CC7}\x{8CC8}\x{8CC9}\x{8CCA}\x{8CCC}\x{8CCE}\x{8CCF}' + . '\x{8CD0}\x{8CD1}\x{8CD2}\x{8CD3}\x{8CD4}\x{8CD5}\x{8CD7}\x{8CD9}\x{8CDA}' + . '\x{8CDB}\x{8CDC}\x{8CDD}\x{8CDE}\x{8CDF}\x{8CE0}\x{8CE1}\x{8CE2}\x{8CE3}' + . '\x{8CE4}\x{8CE5}\x{8CE6}\x{8CE7}\x{8CE8}\x{8CEA}\x{8CEB}\x{8CEC}\x{8CED}' + . '\x{8CEE}\x{8CEF}\x{8CF0}\x{8CF1}\x{8CF2}\x{8CF3}\x{8CF4}\x{8CF5}\x{8CF6}' + . '\x{8CF8}\x{8CF9}\x{8CFA}\x{8CFB}\x{8CFC}\x{8CFD}\x{8CFE}\x{8CFF}\x{8D00}' + . '\x{8D02}\x{8D03}\x{8D04}\x{8D05}\x{8D06}\x{8D07}\x{8D08}\x{8D09}\x{8D0A}' + . '\x{8D0B}\x{8D0C}\x{8D0D}\x{8D0E}\x{8D0F}\x{8D10}\x{8D13}\x{8D14}\x{8D15}' + . '\x{8D16}\x{8D17}\x{8D18}\x{8D19}\x{8D1A}\x{8D1B}\x{8D1C}\x{8D1D}\x{8D1E}' + . '\x{8D1F}\x{8D20}\x{8D21}\x{8D22}\x{8D23}\x{8D24}\x{8D25}\x{8D26}\x{8D27}' + . '\x{8D28}\x{8D29}\x{8D2A}\x{8D2B}\x{8D2C}\x{8D2D}\x{8D2E}\x{8D2F}\x{8D30}' + . '\x{8D31}\x{8D32}\x{8D33}\x{8D34}\x{8D35}\x{8D36}\x{8D37}\x{8D38}\x{8D39}' + . '\x{8D3A}\x{8D3B}\x{8D3C}\x{8D3D}\x{8D3E}\x{8D3F}\x{8D40}\x{8D41}\x{8D42}' + . '\x{8D43}\x{8D44}\x{8D45}\x{8D46}\x{8D47}\x{8D48}\x{8D49}\x{8D4A}\x{8D4B}' + . '\x{8D4C}\x{8D4D}\x{8D4E}\x{8D4F}\x{8D50}\x{8D51}\x{8D52}\x{8D53}\x{8D54}' + . '\x{8D55}\x{8D56}\x{8D57}\x{8D58}\x{8D59}\x{8D5A}\x{8D5B}\x{8D5C}\x{8D5D}' + . '\x{8D5E}\x{8D5F}\x{8D60}\x{8D61}\x{8D62}\x{8D63}\x{8D64}\x{8D65}\x{8D66}' + . '\x{8D67}\x{8D68}\x{8D69}\x{8D6A}\x{8D6B}\x{8D6C}\x{8D6D}\x{8D6E}\x{8D6F}' + . '\x{8D70}\x{8D71}\x{8D72}\x{8D73}\x{8D74}\x{8D75}\x{8D76}\x{8D77}\x{8D78}' + . '\x{8D79}\x{8D7A}\x{8D7B}\x{8D7D}\x{8D7E}\x{8D7F}\x{8D80}\x{8D81}\x{8D82}' + . '\x{8D83}\x{8D84}\x{8D85}\x{8D86}\x{8D87}\x{8D88}\x{8D89}\x{8D8A}\x{8D8B}' + . '\x{8D8C}\x{8D8D}\x{8D8E}\x{8D8F}\x{8D90}\x{8D91}\x{8D92}\x{8D93}\x{8D94}' + . '\x{8D95}\x{8D96}\x{8D97}\x{8D98}\x{8D99}\x{8D9A}\x{8D9B}\x{8D9C}\x{8D9D}' + . '\x{8D9E}\x{8D9F}\x{8DA0}\x{8DA1}\x{8DA2}\x{8DA3}\x{8DA4}\x{8DA5}\x{8DA7}' + . '\x{8DA8}\x{8DA9}\x{8DAA}\x{8DAB}\x{8DAC}\x{8DAD}\x{8DAE}\x{8DAF}\x{8DB0}' + . '\x{8DB1}\x{8DB2}\x{8DB3}\x{8DB4}\x{8DB5}\x{8DB6}\x{8DB7}\x{8DB8}\x{8DB9}' + . '\x{8DBA}\x{8DBB}\x{8DBC}\x{8DBD}\x{8DBE}\x{8DBF}\x{8DC1}\x{8DC2}\x{8DC3}' + . '\x{8DC4}\x{8DC5}\x{8DC6}\x{8DC7}\x{8DC8}\x{8DC9}\x{8DCA}\x{8DCB}\x{8DCC}' + . '\x{8DCD}\x{8DCE}\x{8DCF}\x{8DD0}\x{8DD1}\x{8DD2}\x{8DD3}\x{8DD4}\x{8DD5}' + . '\x{8DD6}\x{8DD7}\x{8DD8}\x{8DD9}\x{8DDA}\x{8DDB}\x{8DDC}\x{8DDD}\x{8DDE}' + . '\x{8DDF}\x{8DE0}\x{8DE1}\x{8DE2}\x{8DE3}\x{8DE4}\x{8DE6}\x{8DE7}\x{8DE8}' + . '\x{8DE9}\x{8DEA}\x{8DEB}\x{8DEC}\x{8DED}\x{8DEE}\x{8DEF}\x{8DF0}\x{8DF1}' + . '\x{8DF2}\x{8DF3}\x{8DF4}\x{8DF5}\x{8DF6}\x{8DF7}\x{8DF8}\x{8DF9}\x{8DFA}' + . '\x{8DFB}\x{8DFC}\x{8DFD}\x{8DFE}\x{8DFF}\x{8E00}\x{8E02}\x{8E03}\x{8E04}' + . '\x{8E05}\x{8E06}\x{8E07}\x{8E08}\x{8E09}\x{8E0A}\x{8E0C}\x{8E0D}\x{8E0E}' + . '\x{8E0F}\x{8E10}\x{8E11}\x{8E12}\x{8E13}\x{8E14}\x{8E15}\x{8E16}\x{8E17}' + . '\x{8E18}\x{8E19}\x{8E1A}\x{8E1B}\x{8E1C}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E20}' + . '\x{8E21}\x{8E22}\x{8E23}\x{8E24}\x{8E25}\x{8E26}\x{8E27}\x{8E28}\x{8E29}' + . '\x{8E2A}\x{8E2B}\x{8E2C}\x{8E2D}\x{8E2E}\x{8E2F}\x{8E30}\x{8E31}\x{8E33}' + . '\x{8E34}\x{8E35}\x{8E36}\x{8E37}\x{8E38}\x{8E39}\x{8E3A}\x{8E3B}\x{8E3C}' + . '\x{8E3D}\x{8E3E}\x{8E3F}\x{8E40}\x{8E41}\x{8E42}\x{8E43}\x{8E44}\x{8E45}' + . '\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4B}\x{8E4C}\x{8E4D}\x{8E4E}\x{8E50}' + . '\x{8E51}\x{8E52}\x{8E53}\x{8E54}\x{8E55}\x{8E56}\x{8E57}\x{8E58}\x{8E59}' + . '\x{8E5A}\x{8E5B}\x{8E5C}\x{8E5D}\x{8E5E}\x{8E5F}\x{8E60}\x{8E61}\x{8E62}' + . '\x{8E63}\x{8E64}\x{8E65}\x{8E66}\x{8E67}\x{8E68}\x{8E69}\x{8E6A}\x{8E6B}' + . '\x{8E6C}\x{8E6D}\x{8E6F}\x{8E70}\x{8E71}\x{8E72}\x{8E73}\x{8E74}\x{8E76}' + . '\x{8E78}\x{8E7A}\x{8E7B}\x{8E7C}\x{8E7D}\x{8E7E}\x{8E7F}\x{8E80}\x{8E81}' + . '\x{8E82}\x{8E83}\x{8E84}\x{8E85}\x{8E86}\x{8E87}\x{8E88}\x{8E89}\x{8E8A}' + . '\x{8E8B}\x{8E8C}\x{8E8D}\x{8E8E}\x{8E8F}\x{8E90}\x{8E91}\x{8E92}\x{8E93}' + . '\x{8E94}\x{8E95}\x{8E96}\x{8E97}\x{8E98}\x{8E9A}\x{8E9C}\x{8E9D}\x{8E9E}' + . '\x{8E9F}\x{8EA0}\x{8EA1}\x{8EA3}\x{8EA4}\x{8EA5}\x{8EA6}\x{8EA7}\x{8EA8}' + . '\x{8EA9}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAD}\x{8EAE}\x{8EAF}\x{8EB0}\x{8EB1}' + . '\x{8EB2}\x{8EB4}\x{8EB5}\x{8EB8}\x{8EB9}\x{8EBA}\x{8EBB}\x{8EBC}\x{8EBD}' + . '\x{8EBE}\x{8EBF}\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}\x{8EC6}\x{8EC7}\x{8EC8}' + . '\x{8EC9}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ECE}\x{8ECF}\x{8ED0}\x{8ED1}' + . '\x{8ED2}\x{8ED3}\x{8ED4}\x{8ED5}\x{8ED6}\x{8ED7}\x{8ED8}\x{8EDA}\x{8EDB}' + . '\x{8EDC}\x{8EDD}\x{8EDE}\x{8EDF}\x{8EE0}\x{8EE1}\x{8EE4}\x{8EE5}\x{8EE6}' + . '\x{8EE7}\x{8EE8}\x{8EE9}\x{8EEA}\x{8EEB}\x{8EEC}\x{8EED}\x{8EEE}\x{8EEF}' + . '\x{8EF1}\x{8EF2}\x{8EF3}\x{8EF4}\x{8EF5}\x{8EF6}\x{8EF7}\x{8EF8}\x{8EF9}' + . '\x{8EFA}\x{8EFB}\x{8EFC}\x{8EFD}\x{8EFE}\x{8EFF}\x{8F00}\x{8F01}\x{8F02}' + . '\x{8F03}\x{8F04}\x{8F05}\x{8F06}\x{8F07}\x{8F08}\x{8F09}\x{8F0A}\x{8F0B}' + . '\x{8F0D}\x{8F0E}\x{8F10}\x{8F11}\x{8F12}\x{8F13}\x{8F14}\x{8F15}\x{8F16}' + . '\x{8F17}\x{8F18}\x{8F1A}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1E}\x{8F1F}\x{8F20}' + . '\x{8F21}\x{8F22}\x{8F23}\x{8F24}\x{8F25}\x{8F26}\x{8F27}\x{8F28}\x{8F29}' + . '\x{8F2A}\x{8F2B}\x{8F2C}\x{8F2E}\x{8F2F}\x{8F30}\x{8F31}\x{8F32}\x{8F33}' + . '\x{8F34}\x{8F35}\x{8F36}\x{8F37}\x{8F38}\x{8F39}\x{8F3B}\x{8F3C}\x{8F3D}' + . '\x{8F3E}\x{8F3F}\x{8F40}\x{8F42}\x{8F43}\x{8F44}\x{8F45}\x{8F46}\x{8F47}' + . '\x{8F48}\x{8F49}\x{8F4A}\x{8F4B}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F4F}\x{8F50}' + . '\x{8F51}\x{8F52}\x{8F53}\x{8F54}\x{8F55}\x{8F56}\x{8F57}\x{8F58}\x{8F59}' + . '\x{8F5A}\x{8F5B}\x{8F5D}\x{8F5E}\x{8F5F}\x{8F60}\x{8F61}\x{8F62}\x{8F63}' + . '\x{8F64}\x{8F65}\x{8F66}\x{8F67}\x{8F68}\x{8F69}\x{8F6A}\x{8F6B}\x{8F6C}' + . '\x{8F6D}\x{8F6E}\x{8F6F}\x{8F70}\x{8F71}\x{8F72}\x{8F73}\x{8F74}\x{8F75}' + . '\x{8F76}\x{8F77}\x{8F78}\x{8F79}\x{8F7A}\x{8F7B}\x{8F7C}\x{8F7D}\x{8F7E}' + . '\x{8F7F}\x{8F80}\x{8F81}\x{8F82}\x{8F83}\x{8F84}\x{8F85}\x{8F86}\x{8F87}' + . '\x{8F88}\x{8F89}\x{8F8A}\x{8F8B}\x{8F8C}\x{8F8D}\x{8F8E}\x{8F8F}\x{8F90}' + . '\x{8F91}\x{8F92}\x{8F93}\x{8F94}\x{8F95}\x{8F96}\x{8F97}\x{8F98}\x{8F99}' + . '\x{8F9A}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA0}\x{8FA1}\x{8FA2}\x{8FA3}' + . '\x{8FA5}\x{8FA6}\x{8FA7}\x{8FA8}\x{8FA9}\x{8FAA}\x{8FAB}\x{8FAC}\x{8FAD}' + . '\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB4}\x{8FB5}\x{8FB6}\x{8FB7}' + . '\x{8FB8}\x{8FB9}\x{8FBB}\x{8FBC}\x{8FBD}\x{8FBE}\x{8FBF}\x{8FC0}\x{8FC1}' + . '\x{8FC2}\x{8FC4}\x{8FC5}\x{8FC6}\x{8FC7}\x{8FC8}\x{8FC9}\x{8FCB}\x{8FCC}' + . '\x{8FCD}\x{8FCE}\x{8FCF}\x{8FD0}\x{8FD1}\x{8FD2}\x{8FD3}\x{8FD4}\x{8FD5}' + . '\x{8FD6}\x{8FD7}\x{8FD8}\x{8FD9}\x{8FDA}\x{8FDB}\x{8FDC}\x{8FDD}\x{8FDE}' + . '\x{8FDF}\x{8FE0}\x{8FE1}\x{8FE2}\x{8FE3}\x{8FE4}\x{8FE5}\x{8FE6}\x{8FE8}' + . '\x{8FE9}\x{8FEA}\x{8FEB}\x{8FEC}\x{8FED}\x{8FEE}\x{8FEF}\x{8FF0}\x{8FF1}' + . '\x{8FF2}\x{8FF3}\x{8FF4}\x{8FF5}\x{8FF6}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}' + . '\x{8FFB}\x{8FFC}\x{8FFD}\x{8FFE}\x{8FFF}\x{9000}\x{9001}\x{9002}\x{9003}' + . '\x{9004}\x{9005}\x{9006}\x{9007}\x{9008}\x{9009}\x{900A}\x{900B}\x{900C}' + . '\x{900D}\x{900F}\x{9010}\x{9011}\x{9012}\x{9013}\x{9014}\x{9015}\x{9016}' + . '\x{9017}\x{9018}\x{9019}\x{901A}\x{901B}\x{901C}\x{901D}\x{901E}\x{901F}' + . '\x{9020}\x{9021}\x{9022}\x{9023}\x{9024}\x{9025}\x{9026}\x{9027}\x{9028}' + . '\x{9029}\x{902B}\x{902D}\x{902E}\x{902F}\x{9030}\x{9031}\x{9032}\x{9033}' + . '\x{9034}\x{9035}\x{9036}\x{9038}\x{903A}\x{903B}\x{903C}\x{903D}\x{903E}' + . '\x{903F}\x{9041}\x{9042}\x{9043}\x{9044}\x{9045}\x{9047}\x{9048}\x{9049}' + . '\x{904A}\x{904B}\x{904C}\x{904D}\x{904E}\x{904F}\x{9050}\x{9051}\x{9052}' + . '\x{9053}\x{9054}\x{9055}\x{9056}\x{9057}\x{9058}\x{9059}\x{905A}\x{905B}' + . '\x{905C}\x{905D}\x{905E}\x{905F}\x{9060}\x{9061}\x{9062}\x{9063}\x{9064}' + . '\x{9065}\x{9066}\x{9067}\x{9068}\x{9069}\x{906A}\x{906B}\x{906C}\x{906D}' + . '\x{906E}\x{906F}\x{9070}\x{9071}\x{9072}\x{9073}\x{9074}\x{9075}\x{9076}' + . '\x{9077}\x{9078}\x{9079}\x{907A}\x{907B}\x{907C}\x{907D}\x{907E}\x{907F}' + . '\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9085}\x{9086}\x{9087}\x{9088}' + . '\x{9089}\x{908A}\x{908B}\x{908C}\x{908D}\x{908E}\x{908F}\x{9090}\x{9091}' + . '\x{9092}\x{9093}\x{9094}\x{9095}\x{9096}\x{9097}\x{9098}\x{9099}\x{909A}' + . '\x{909B}\x{909C}\x{909D}\x{909E}\x{909F}\x{90A0}\x{90A1}\x{90A2}\x{90A3}' + . '\x{90A4}\x{90A5}\x{90A6}\x{90A7}\x{90A8}\x{90A9}\x{90AA}\x{90AC}\x{90AD}' + . '\x{90AE}\x{90AF}\x{90B0}\x{90B1}\x{90B2}\x{90B3}\x{90B4}\x{90B5}\x{90B6}' + . '\x{90B7}\x{90B8}\x{90B9}\x{90BA}\x{90BB}\x{90BC}\x{90BD}\x{90BE}\x{90BF}' + . '\x{90C0}\x{90C1}\x{90C2}\x{90C3}\x{90C4}\x{90C5}\x{90C6}\x{90C7}\x{90C8}' + . '\x{90C9}\x{90CA}\x{90CB}\x{90CE}\x{90CF}\x{90D0}\x{90D1}\x{90D3}\x{90D4}' + . '\x{90D5}\x{90D6}\x{90D7}\x{90D8}\x{90D9}\x{90DA}\x{90DB}\x{90DC}\x{90DD}' + . '\x{90DE}\x{90DF}\x{90E0}\x{90E1}\x{90E2}\x{90E3}\x{90E4}\x{90E5}\x{90E6}' + . '\x{90E7}\x{90E8}\x{90E9}\x{90EA}\x{90EB}\x{90EC}\x{90ED}\x{90EE}\x{90EF}' + . '\x{90F0}\x{90F1}\x{90F2}\x{90F3}\x{90F4}\x{90F5}\x{90F7}\x{90F8}\x{90F9}' + . '\x{90FA}\x{90FB}\x{90FC}\x{90FD}\x{90FE}\x{90FF}\x{9100}\x{9101}\x{9102}' + . '\x{9103}\x{9104}\x{9105}\x{9106}\x{9107}\x{9108}\x{9109}\x{910B}\x{910C}' + . '\x{910D}\x{910E}\x{910F}\x{9110}\x{9111}\x{9112}\x{9113}\x{9114}\x{9115}' + . '\x{9116}\x{9117}\x{9118}\x{9119}\x{911A}\x{911B}\x{911C}\x{911D}\x{911E}' + . '\x{911F}\x{9120}\x{9121}\x{9122}\x{9123}\x{9124}\x{9125}\x{9126}\x{9127}' + . '\x{9128}\x{9129}\x{912A}\x{912B}\x{912C}\x{912D}\x{912E}\x{912F}\x{9130}' + . '\x{9131}\x{9132}\x{9133}\x{9134}\x{9135}\x{9136}\x{9137}\x{9138}\x{9139}' + . '\x{913A}\x{913B}\x{913E}\x{913F}\x{9140}\x{9141}\x{9142}\x{9143}\x{9144}' + . '\x{9145}\x{9146}\x{9147}\x{9148}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}' + . '\x{914E}\x{914F}\x{9150}\x{9151}\x{9152}\x{9153}\x{9154}\x{9155}\x{9156}' + . '\x{9157}\x{9158}\x{915A}\x{915B}\x{915C}\x{915D}\x{915E}\x{915F}\x{9160}' + . '\x{9161}\x{9162}\x{9163}\x{9164}\x{9165}\x{9166}\x{9167}\x{9168}\x{9169}' + . '\x{916A}\x{916B}\x{916C}\x{916D}\x{916E}\x{916F}\x{9170}\x{9171}\x{9172}' + . '\x{9173}\x{9174}\x{9175}\x{9176}\x{9177}\x{9178}\x{9179}\x{917A}\x{917C}' + . '\x{917D}\x{917E}\x{917F}\x{9180}\x{9181}\x{9182}\x{9183}\x{9184}\x{9185}' + . '\x{9186}\x{9187}\x{9188}\x{9189}\x{918A}\x{918B}\x{918C}\x{918D}\x{918E}' + . '\x{918F}\x{9190}\x{9191}\x{9192}\x{9193}\x{9194}\x{9196}\x{9199}\x{919A}' + . '\x{919B}\x{919C}\x{919D}\x{919E}\x{919F}\x{91A0}\x{91A1}\x{91A2}\x{91A3}' + . '\x{91A5}\x{91A6}\x{91A7}\x{91A8}\x{91AA}\x{91AB}\x{91AC}\x{91AD}\x{91AE}' + . '\x{91AF}\x{91B0}\x{91B1}\x{91B2}\x{91B3}\x{91B4}\x{91B5}\x{91B6}\x{91B7}' + . '\x{91B9}\x{91BA}\x{91BB}\x{91BC}\x{91BD}\x{91BE}\x{91C0}\x{91C1}\x{91C2}' + . '\x{91C3}\x{91C5}\x{91C6}\x{91C7}\x{91C9}\x{91CA}\x{91CB}\x{91CC}\x{91CD}' + . '\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D2}\x{91D3}\x{91D4}\x{91D5}\x{91D7}' + . '\x{91D8}\x{91D9}\x{91DA}\x{91DB}\x{91DC}\x{91DD}\x{91DE}\x{91DF}\x{91E2}' + . '\x{91E3}\x{91E4}\x{91E5}\x{91E6}\x{91E7}\x{91E8}\x{91E9}\x{91EA}\x{91EB}' + . '\x{91EC}\x{91ED}\x{91EE}\x{91F0}\x{91F1}\x{91F2}\x{91F3}\x{91F4}\x{91F5}' + . '\x{91F7}\x{91F8}\x{91F9}\x{91FA}\x{91FB}\x{91FD}\x{91FE}\x{91FF}\x{9200}' + . '\x{9201}\x{9202}\x{9203}\x{9204}\x{9205}\x{9206}\x{9207}\x{9208}\x{9209}' + . '\x{920A}\x{920B}\x{920C}\x{920D}\x{920E}\x{920F}\x{9210}\x{9211}\x{9212}' + . '\x{9214}\x{9215}\x{9216}\x{9217}\x{9218}\x{9219}\x{921A}\x{921B}\x{921C}' + . '\x{921D}\x{921E}\x{9220}\x{9221}\x{9223}\x{9224}\x{9225}\x{9226}\x{9227}' + . '\x{9228}\x{9229}\x{922A}\x{922B}\x{922D}\x{922E}\x{922F}\x{9230}\x{9231}' + . '\x{9232}\x{9233}\x{9234}\x{9235}\x{9236}\x{9237}\x{9238}\x{9239}\x{923A}' + . '\x{923B}\x{923C}\x{923D}\x{923E}\x{923F}\x{9240}\x{9241}\x{9242}\x{9245}' + . '\x{9246}\x{9247}\x{9248}\x{9249}\x{924A}\x{924B}\x{924C}\x{924D}\x{924E}' + . '\x{924F}\x{9250}\x{9251}\x{9252}\x{9253}\x{9254}\x{9255}\x{9256}\x{9257}' + . '\x{9258}\x{9259}\x{925A}\x{925B}\x{925C}\x{925D}\x{925E}\x{925F}\x{9260}' + . '\x{9261}\x{9262}\x{9263}\x{9264}\x{9265}\x{9266}\x{9267}\x{9268}\x{926B}' + . '\x{926C}\x{926D}\x{926E}\x{926F}\x{9270}\x{9272}\x{9273}\x{9274}\x{9275}' + . '\x{9276}\x{9277}\x{9278}\x{9279}\x{927A}\x{927B}\x{927C}\x{927D}\x{927E}' + . '\x{927F}\x{9280}\x{9282}\x{9283}\x{9285}\x{9286}\x{9287}\x{9288}\x{9289}' + . '\x{928A}\x{928B}\x{928C}\x{928D}\x{928E}\x{928F}\x{9290}\x{9291}\x{9292}' + . '\x{9293}\x{9294}\x{9295}\x{9296}\x{9297}\x{9298}\x{9299}\x{929A}\x{929B}' + . '\x{929C}\x{929D}\x{929F}\x{92A0}\x{92A1}\x{92A2}\x{92A3}\x{92A4}\x{92A5}' + . '\x{92A6}\x{92A7}\x{92A8}\x{92A9}\x{92AA}\x{92AB}\x{92AC}\x{92AD}\x{92AE}' + . '\x{92AF}\x{92B0}\x{92B1}\x{92B2}\x{92B3}\x{92B4}\x{92B5}\x{92B6}\x{92B7}' + . '\x{92B8}\x{92B9}\x{92BA}\x{92BB}\x{92BC}\x{92BE}\x{92BF}\x{92C0}\x{92C1}' + . '\x{92C2}\x{92C3}\x{92C4}\x{92C5}\x{92C6}\x{92C7}\x{92C8}\x{92C9}\x{92CA}' + . '\x{92CB}\x{92CC}\x{92CD}\x{92CE}\x{92CF}\x{92D0}\x{92D1}\x{92D2}\x{92D3}' + . '\x{92D5}\x{92D6}\x{92D7}\x{92D8}\x{92D9}\x{92DA}\x{92DC}\x{92DD}\x{92DE}' + . '\x{92DF}\x{92E0}\x{92E1}\x{92E3}\x{92E4}\x{92E5}\x{92E6}\x{92E7}\x{92E8}' + . '\x{92E9}\x{92EA}\x{92EB}\x{92EC}\x{92ED}\x{92EE}\x{92EF}\x{92F0}\x{92F1}' + . '\x{92F2}\x{92F3}\x{92F4}\x{92F5}\x{92F6}\x{92F7}\x{92F8}\x{92F9}\x{92FA}' + . '\x{92FB}\x{92FC}\x{92FD}\x{92FE}\x{92FF}\x{9300}\x{9301}\x{9302}\x{9303}' + . '\x{9304}\x{9305}\x{9306}\x{9307}\x{9308}\x{9309}\x{930A}\x{930B}\x{930C}' + . '\x{930D}\x{930E}\x{930F}\x{9310}\x{9311}\x{9312}\x{9313}\x{9314}\x{9315}' + . '\x{9316}\x{9317}\x{9318}\x{9319}\x{931A}\x{931B}\x{931D}\x{931E}\x{931F}' + . '\x{9320}\x{9321}\x{9322}\x{9323}\x{9324}\x{9325}\x{9326}\x{9327}\x{9328}' + . '\x{9329}\x{932A}\x{932B}\x{932D}\x{932E}\x{932F}\x{9332}\x{9333}\x{9334}' + . '\x{9335}\x{9336}\x{9337}\x{9338}\x{9339}\x{933A}\x{933B}\x{933C}\x{933D}' + . '\x{933E}\x{933F}\x{9340}\x{9341}\x{9342}\x{9343}\x{9344}\x{9345}\x{9346}' + . '\x{9347}\x{9348}\x{9349}\x{934A}\x{934B}\x{934C}\x{934D}\x{934E}\x{934F}' + . '\x{9350}\x{9351}\x{9352}\x{9353}\x{9354}\x{9355}\x{9356}\x{9357}\x{9358}' + . '\x{9359}\x{935A}\x{935B}\x{935C}\x{935D}\x{935E}\x{935F}\x{9360}\x{9361}' + . '\x{9363}\x{9364}\x{9365}\x{9366}\x{9367}\x{9369}\x{936A}\x{936C}\x{936D}' + . '\x{936E}\x{9370}\x{9371}\x{9372}\x{9374}\x{9375}\x{9376}\x{9377}\x{9379}' + . '\x{937A}\x{937B}\x{937C}\x{937D}\x{937E}\x{9380}\x{9382}\x{9383}\x{9384}' + . '\x{9385}\x{9386}\x{9387}\x{9388}\x{9389}\x{938A}\x{938C}\x{938D}\x{938E}' + . '\x{938F}\x{9390}\x{9391}\x{9392}\x{9393}\x{9394}\x{9395}\x{9396}\x{9397}' + . '\x{9398}\x{9399}\x{939A}\x{939B}\x{939D}\x{939E}\x{939F}\x{93A1}\x{93A2}' + . '\x{93A3}\x{93A4}\x{93A5}\x{93A6}\x{93A7}\x{93A8}\x{93A9}\x{93AA}\x{93AC}' + . '\x{93AD}\x{93AE}\x{93AF}\x{93B0}\x{93B1}\x{93B2}\x{93B3}\x{93B4}\x{93B5}' + . '\x{93B6}\x{93B7}\x{93B8}\x{93B9}\x{93BA}\x{93BC}\x{93BD}\x{93BE}\x{93BF}' + . '\x{93C0}\x{93C1}\x{93C2}\x{93C3}\x{93C4}\x{93C5}\x{93C6}\x{93C7}\x{93C8}' + . '\x{93C9}\x{93CA}\x{93CB}\x{93CC}\x{93CD}\x{93CE}\x{93CF}\x{93D0}\x{93D1}' + . '\x{93D2}\x{93D3}\x{93D4}\x{93D5}\x{93D6}\x{93D7}\x{93D8}\x{93D9}\x{93DA}' + . '\x{93DB}\x{93DC}\x{93DD}\x{93DE}\x{93DF}\x{93E1}\x{93E2}\x{93E3}\x{93E4}' + . '\x{93E6}\x{93E7}\x{93E8}\x{93E9}\x{93EA}\x{93EB}\x{93EC}\x{93ED}\x{93EE}' + . '\x{93EF}\x{93F0}\x{93F1}\x{93F2}\x{93F4}\x{93F5}\x{93F6}\x{93F7}\x{93F8}' + . '\x{93F9}\x{93FA}\x{93FB}\x{93FC}\x{93FD}\x{93FE}\x{93FF}\x{9400}\x{9401}' + . '\x{9403}\x{9404}\x{9405}\x{9406}\x{9407}\x{9408}\x{9409}\x{940A}\x{940B}' + . '\x{940C}\x{940D}\x{940E}\x{940F}\x{9410}\x{9411}\x{9412}\x{9413}\x{9414}' + . '\x{9415}\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}\x{9422}\x{9423}' + . '\x{9425}\x{9426}\x{9427}\x{9428}\x{9429}\x{942A}\x{942B}\x{942C}\x{942D}' + . '\x{942E}\x{942F}\x{9430}\x{9431}\x{9432}\x{9433}\x{9434}\x{9435}\x{9436}' + . '\x{9437}\x{9438}\x{9439}\x{943A}\x{943B}\x{943C}\x{943D}\x{943E}\x{943F}' + . '\x{9440}\x{9441}\x{9442}\x{9444}\x{9445}\x{9446}\x{9447}\x{9448}\x{9449}' + . '\x{944A}\x{944B}\x{944C}\x{944D}\x{944F}\x{9450}\x{9451}\x{9452}\x{9453}' + . '\x{9454}\x{9455}\x{9456}\x{9457}\x{9458}\x{9459}\x{945B}\x{945C}\x{945D}' + . '\x{945E}\x{945F}\x{9460}\x{9461}\x{9462}\x{9463}\x{9464}\x{9465}\x{9466}' + . '\x{9467}\x{9468}\x{9469}\x{946A}\x{946B}\x{946D}\x{946E}\x{946F}\x{9470}' + . '\x{9471}\x{9472}\x{9473}\x{9474}\x{9475}\x{9476}\x{9477}\x{9478}\x{9479}' + . '\x{947A}\x{947C}\x{947D}\x{947E}\x{947F}\x{9480}\x{9481}\x{9482}\x{9483}' + . '\x{9484}\x{9485}\x{9486}\x{9487}\x{9488}\x{9489}\x{948A}\x{948B}\x{948C}' + . '\x{948D}\x{948E}\x{948F}\x{9490}\x{9491}\x{9492}\x{9493}\x{9494}\x{9495}' + . '\x{9496}\x{9497}\x{9498}\x{9499}\x{949A}\x{949B}\x{949C}\x{949D}\x{949E}' + . '\x{949F}\x{94A0}\x{94A1}\x{94A2}\x{94A3}\x{94A4}\x{94A5}\x{94A6}\x{94A7}' + . '\x{94A8}\x{94A9}\x{94AA}\x{94AB}\x{94AC}\x{94AD}\x{94AE}\x{94AF}\x{94B0}' + . '\x{94B1}\x{94B2}\x{94B3}\x{94B4}\x{94B5}\x{94B6}\x{94B7}\x{94B8}\x{94B9}' + . '\x{94BA}\x{94BB}\x{94BC}\x{94BD}\x{94BE}\x{94BF}\x{94C0}\x{94C1}\x{94C2}' + . '\x{94C3}\x{94C4}\x{94C5}\x{94C6}\x{94C7}\x{94C8}\x{94C9}\x{94CA}\x{94CB}' + . '\x{94CC}\x{94CD}\x{94CE}\x{94CF}\x{94D0}\x{94D1}\x{94D2}\x{94D3}\x{94D4}' + . '\x{94D5}\x{94D6}\x{94D7}\x{94D8}\x{94D9}\x{94DA}\x{94DB}\x{94DC}\x{94DD}' + . '\x{94DE}\x{94DF}\x{94E0}\x{94E1}\x{94E2}\x{94E3}\x{94E4}\x{94E5}\x{94E6}' + . '\x{94E7}\x{94E8}\x{94E9}\x{94EA}\x{94EB}\x{94EC}\x{94ED}\x{94EE}\x{94EF}' + . '\x{94F0}\x{94F1}\x{94F2}\x{94F3}\x{94F4}\x{94F5}\x{94F6}\x{94F7}\x{94F8}' + . '\x{94F9}\x{94FA}\x{94FB}\x{94FC}\x{94FD}\x{94FE}\x{94FF}\x{9500}\x{9501}' + . '\x{9502}\x{9503}\x{9504}\x{9505}\x{9506}\x{9507}\x{9508}\x{9509}\x{950A}' + . '\x{950B}\x{950C}\x{950D}\x{950E}\x{950F}\x{9510}\x{9511}\x{9512}\x{9513}' + . '\x{9514}\x{9515}\x{9516}\x{9517}\x{9518}\x{9519}\x{951A}\x{951B}\x{951C}' + . '\x{951D}\x{951E}\x{951F}\x{9520}\x{9521}\x{9522}\x{9523}\x{9524}\x{9525}' + . '\x{9526}\x{9527}\x{9528}\x{9529}\x{952A}\x{952B}\x{952C}\x{952D}\x{952E}' + . '\x{952F}\x{9530}\x{9531}\x{9532}\x{9533}\x{9534}\x{9535}\x{9536}\x{9537}' + . '\x{9538}\x{9539}\x{953A}\x{953B}\x{953C}\x{953D}\x{953E}\x{953F}\x{9540}' + . '\x{9541}\x{9542}\x{9543}\x{9544}\x{9545}\x{9546}\x{9547}\x{9548}\x{9549}' + . '\x{954A}\x{954B}\x{954C}\x{954D}\x{954E}\x{954F}\x{9550}\x{9551}\x{9552}' + . '\x{9553}\x{9554}\x{9555}\x{9556}\x{9557}\x{9558}\x{9559}\x{955A}\x{955B}' + . '\x{955C}\x{955D}\x{955E}\x{955F}\x{9560}\x{9561}\x{9562}\x{9563}\x{9564}' + . '\x{9565}\x{9566}\x{9567}\x{9568}\x{9569}\x{956A}\x{956B}\x{956C}\x{956D}' + . '\x{956E}\x{956F}\x{9570}\x{9571}\x{9572}\x{9573}\x{9574}\x{9575}\x{9576}' + . '\x{9577}\x{957A}\x{957B}\x{957C}\x{957D}\x{957F}\x{9580}\x{9581}\x{9582}' + . '\x{9583}\x{9584}\x{9586}\x{9587}\x{9588}\x{9589}\x{958A}\x{958B}\x{958C}' + . '\x{958D}\x{958E}\x{958F}\x{9590}\x{9591}\x{9592}\x{9593}\x{9594}\x{9595}' + . '\x{9596}\x{9598}\x{9599}\x{959A}\x{959B}\x{959C}\x{959D}\x{959E}\x{959F}' + . '\x{95A1}\x{95A2}\x{95A3}\x{95A4}\x{95A5}\x{95A6}\x{95A7}\x{95A8}\x{95A9}' + . '\x{95AA}\x{95AB}\x{95AC}\x{95AD}\x{95AE}\x{95AF}\x{95B0}\x{95B1}\x{95B2}' + . '\x{95B5}\x{95B6}\x{95B7}\x{95B9}\x{95BA}\x{95BB}\x{95BC}\x{95BD}\x{95BE}' + . '\x{95BF}\x{95C0}\x{95C2}\x{95C3}\x{95C4}\x{95C5}\x{95C6}\x{95C7}\x{95C8}' + . '\x{95C9}\x{95CA}\x{95CB}\x{95CC}\x{95CD}\x{95CE}\x{95CF}\x{95D0}\x{95D1}' + . '\x{95D2}\x{95D3}\x{95D4}\x{95D5}\x{95D6}\x{95D7}\x{95D8}\x{95DA}\x{95DB}' + . '\x{95DC}\x{95DE}\x{95DF}\x{95E0}\x{95E1}\x{95E2}\x{95E3}\x{95E4}\x{95E5}' + . '\x{95E6}\x{95E7}\x{95E8}\x{95E9}\x{95EA}\x{95EB}\x{95EC}\x{95ED}\x{95EE}' + . '\x{95EF}\x{95F0}\x{95F1}\x{95F2}\x{95F3}\x{95F4}\x{95F5}\x{95F6}\x{95F7}' + . '\x{95F8}\x{95F9}\x{95FA}\x{95FB}\x{95FC}\x{95FD}\x{95FE}\x{95FF}\x{9600}' + . '\x{9601}\x{9602}\x{9603}\x{9604}\x{9605}\x{9606}\x{9607}\x{9608}\x{9609}' + . '\x{960A}\x{960B}\x{960C}\x{960D}\x{960E}\x{960F}\x{9610}\x{9611}\x{9612}' + . '\x{9613}\x{9614}\x{9615}\x{9616}\x{9617}\x{9618}\x{9619}\x{961A}\x{961B}' + . '\x{961C}\x{961D}\x{961E}\x{961F}\x{9620}\x{9621}\x{9622}\x{9623}\x{9624}' + . '\x{9627}\x{9628}\x{962A}\x{962B}\x{962C}\x{962D}\x{962E}\x{962F}\x{9630}' + . '\x{9631}\x{9632}\x{9633}\x{9634}\x{9635}\x{9636}\x{9637}\x{9638}\x{9639}' + . '\x{963A}\x{963B}\x{963C}\x{963D}\x{963F}\x{9640}\x{9641}\x{9642}\x{9643}' + . '\x{9644}\x{9645}\x{9646}\x{9647}\x{9648}\x{9649}\x{964A}\x{964B}\x{964C}' + . '\x{964D}\x{964E}\x{964F}\x{9650}\x{9651}\x{9652}\x{9653}\x{9654}\x{9655}' + . '\x{9658}\x{9659}\x{965A}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9660}' + . '\x{9661}\x{9662}\x{9663}\x{9664}\x{9666}\x{9667}\x{9668}\x{9669}\x{966A}' + . '\x{966B}\x{966C}\x{966D}\x{966E}\x{966F}\x{9670}\x{9671}\x{9672}\x{9673}' + . '\x{9674}\x{9675}\x{9676}\x{9677}\x{9678}\x{967C}\x{967D}\x{967E}\x{9680}' + . '\x{9683}\x{9684}\x{9685}\x{9686}\x{9687}\x{9688}\x{9689}\x{968A}\x{968B}' + . '\x{968D}\x{968E}\x{968F}\x{9690}\x{9691}\x{9692}\x{9693}\x{9694}\x{9695}' + . '\x{9697}\x{9698}\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}\x{96A1}\x{96A2}' + . '\x{96A3}\x{96A4}\x{96A5}\x{96A6}\x{96A7}\x{96A8}\x{96A9}\x{96AA}\x{96AC}' + . '\x{96AD}\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}\x{96B7}\x{96B8}' + . '\x{96B9}\x{96BA}\x{96BB}\x{96BC}\x{96BD}\x{96BE}\x{96BF}\x{96C0}\x{96C1}' + . '\x{96C2}\x{96C3}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C8}\x{96C9}\x{96CA}' + . '\x{96CB}\x{96CC}\x{96CD}\x{96CE}\x{96CF}\x{96D0}\x{96D1}\x{96D2}\x{96D3}' + . '\x{96D4}\x{96D5}\x{96D6}\x{96D7}\x{96D8}\x{96D9}\x{96DA}\x{96DB}\x{96DC}' + . '\x{96DD}\x{96DE}\x{96DF}\x{96E0}\x{96E1}\x{96E2}\x{96E3}\x{96E5}\x{96E8}' + . '\x{96E9}\x{96EA}\x{96EB}\x{96EC}\x{96ED}\x{96EE}\x{96EF}\x{96F0}\x{96F1}' + . '\x{96F2}\x{96F3}\x{96F4}\x{96F5}\x{96F6}\x{96F7}\x{96F8}\x{96F9}\x{96FA}' + . '\x{96FB}\x{96FD}\x{96FE}\x{96FF}\x{9700}\x{9701}\x{9702}\x{9703}\x{9704}' + . '\x{9705}\x{9706}\x{9707}\x{9708}\x{9709}\x{970A}\x{970B}\x{970C}\x{970D}' + . '\x{970E}\x{970F}\x{9710}\x{9711}\x{9712}\x{9713}\x{9715}\x{9716}\x{9718}' + . '\x{9719}\x{971C}\x{971D}\x{971E}\x{971F}\x{9720}\x{9721}\x{9722}\x{9723}' + . '\x{9724}\x{9725}\x{9726}\x{9727}\x{9728}\x{9729}\x{972A}\x{972B}\x{972C}' + . '\x{972D}\x{972E}\x{972F}\x{9730}\x{9731}\x{9732}\x{9735}\x{9736}\x{9738}' + . '\x{9739}\x{973A}\x{973B}\x{973C}\x{973D}\x{973E}\x{973F}\x{9742}\x{9743}' + . '\x{9744}\x{9745}\x{9746}\x{9747}\x{9748}\x{9749}\x{974A}\x{974B}\x{974C}' + . '\x{974E}\x{974F}\x{9750}\x{9751}\x{9752}\x{9753}\x{9754}\x{9755}\x{9756}' + . '\x{9758}\x{9759}\x{975A}\x{975B}\x{975C}\x{975D}\x{975E}\x{975F}\x{9760}' + . '\x{9761}\x{9762}\x{9765}\x{9766}\x{9767}\x{9768}\x{9769}\x{976A}\x{976B}' + . '\x{976C}\x{976D}\x{976E}\x{976F}\x{9770}\x{9772}\x{9773}\x{9774}\x{9776}' + . '\x{9777}\x{9778}\x{9779}\x{977A}\x{977B}\x{977C}\x{977D}\x{977E}\x{977F}' + . '\x{9780}\x{9781}\x{9782}\x{9783}\x{9784}\x{9785}\x{9786}\x{9788}\x{978A}' + . '\x{978B}\x{978C}\x{978D}\x{978E}\x{978F}\x{9790}\x{9791}\x{9792}\x{9793}' + . '\x{9794}\x{9795}\x{9796}\x{9797}\x{9798}\x{9799}\x{979A}\x{979C}\x{979D}' + . '\x{979E}\x{979F}\x{97A0}\x{97A1}\x{97A2}\x{97A3}\x{97A4}\x{97A5}\x{97A6}' + . '\x{97A7}\x{97A8}\x{97AA}\x{97AB}\x{97AC}\x{97AD}\x{97AE}\x{97AF}\x{97B2}' + . '\x{97B3}\x{97B4}\x{97B6}\x{97B7}\x{97B8}\x{97B9}\x{97BA}\x{97BB}\x{97BC}' + . '\x{97BD}\x{97BF}\x{97C1}\x{97C2}\x{97C3}\x{97C4}\x{97C5}\x{97C6}\x{97C7}' + . '\x{97C8}\x{97C9}\x{97CA}\x{97CB}\x{97CC}\x{97CD}\x{97CE}\x{97CF}\x{97D0}' + . '\x{97D1}\x{97D3}\x{97D4}\x{97D5}\x{97D6}\x{97D7}\x{97D8}\x{97D9}\x{97DA}' + . '\x{97DB}\x{97DC}\x{97DD}\x{97DE}\x{97DF}\x{97E0}\x{97E1}\x{97E2}\x{97E3}' + . '\x{97E4}\x{97E5}\x{97E6}\x{97E7}\x{97E8}\x{97E9}\x{97EA}\x{97EB}\x{97EC}' + . '\x{97ED}\x{97EE}\x{97EF}\x{97F0}\x{97F1}\x{97F2}\x{97F3}\x{97F4}\x{97F5}' + . '\x{97F6}\x{97F7}\x{97F8}\x{97F9}\x{97FA}\x{97FB}\x{97FD}\x{97FE}\x{97FF}' + . '\x{9800}\x{9801}\x{9802}\x{9803}\x{9804}\x{9805}\x{9806}\x{9807}\x{9808}' + . '\x{9809}\x{980A}\x{980B}\x{980C}\x{980D}\x{980E}\x{980F}\x{9810}\x{9811}' + . '\x{9812}\x{9813}\x{9814}\x{9815}\x{9816}\x{9817}\x{9818}\x{9819}\x{981A}' + . '\x{981B}\x{981C}\x{981D}\x{981E}\x{9820}\x{9821}\x{9822}\x{9823}\x{9824}' + . '\x{9826}\x{9827}\x{9828}\x{9829}\x{982B}\x{982D}\x{982E}\x{982F}\x{9830}' + . '\x{9831}\x{9832}\x{9834}\x{9835}\x{9836}\x{9837}\x{9838}\x{9839}\x{983B}' + . '\x{983C}\x{983D}\x{983F}\x{9840}\x{9841}\x{9843}\x{9844}\x{9845}\x{9846}' + . '\x{9848}\x{9849}\x{984A}\x{984C}\x{984D}\x{984E}\x{984F}\x{9850}\x{9851}' + . '\x{9852}\x{9853}\x{9854}\x{9855}\x{9857}\x{9858}\x{9859}\x{985A}\x{985B}' + . '\x{985C}\x{985D}\x{985E}\x{985F}\x{9860}\x{9861}\x{9862}\x{9863}\x{9864}' + . '\x{9865}\x{9867}\x{9869}\x{986A}\x{986B}\x{986C}\x{986D}\x{986E}\x{986F}' + . '\x{9870}\x{9871}\x{9872}\x{9873}\x{9874}\x{9875}\x{9876}\x{9877}\x{9878}' + . '\x{9879}\x{987A}\x{987B}\x{987C}\x{987D}\x{987E}\x{987F}\x{9880}\x{9881}' + . '\x{9882}\x{9883}\x{9884}\x{9885}\x{9886}\x{9887}\x{9888}\x{9889}\x{988A}' + . '\x{988B}\x{988C}\x{988D}\x{988E}\x{988F}\x{9890}\x{9891}\x{9892}\x{9893}' + . '\x{9894}\x{9895}\x{9896}\x{9897}\x{9898}\x{9899}\x{989A}\x{989B}\x{989C}' + . '\x{989D}\x{989E}\x{989F}\x{98A0}\x{98A1}\x{98A2}\x{98A3}\x{98A4}\x{98A5}' + . '\x{98A6}\x{98A7}\x{98A8}\x{98A9}\x{98AA}\x{98AB}\x{98AC}\x{98AD}\x{98AE}' + . '\x{98AF}\x{98B0}\x{98B1}\x{98B2}\x{98B3}\x{98B4}\x{98B5}\x{98B6}\x{98B8}' + . '\x{98B9}\x{98BA}\x{98BB}\x{98BC}\x{98BD}\x{98BE}\x{98BF}\x{98C0}\x{98C1}' + . '\x{98C2}\x{98C3}\x{98C4}\x{98C5}\x{98C6}\x{98C8}\x{98C9}\x{98CB}\x{98CC}' + . '\x{98CD}\x{98CE}\x{98CF}\x{98D0}\x{98D1}\x{98D2}\x{98D3}\x{98D4}\x{98D5}' + . '\x{98D6}\x{98D7}\x{98D8}\x{98D9}\x{98DA}\x{98DB}\x{98DC}\x{98DD}\x{98DE}' + . '\x{98DF}\x{98E0}\x{98E2}\x{98E3}\x{98E5}\x{98E6}\x{98E7}\x{98E8}\x{98E9}' + . '\x{98EA}\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}\x{98F3}\x{98F4}\x{98F5}' + . '\x{98F6}\x{98F7}\x{98F9}\x{98FA}\x{98FC}\x{98FD}\x{98FE}\x{98FF}\x{9900}' + . '\x{9901}\x{9902}\x{9903}\x{9904}\x{9905}\x{9906}\x{9907}\x{9908}\x{9909}' + . '\x{990A}\x{990B}\x{990C}\x{990D}\x{990E}\x{990F}\x{9910}\x{9911}\x{9912}' + . '\x{9913}\x{9914}\x{9915}\x{9916}\x{9917}\x{9918}\x{991A}\x{991B}\x{991C}' + . '\x{991D}\x{991E}\x{991F}\x{9920}\x{9921}\x{9922}\x{9923}\x{9924}\x{9925}' + . '\x{9926}\x{9927}\x{9928}\x{9929}\x{992A}\x{992B}\x{992C}\x{992D}\x{992E}' + . '\x{992F}\x{9930}\x{9931}\x{9932}\x{9933}\x{9934}\x{9935}\x{9936}\x{9937}' + . '\x{9938}\x{9939}\x{993A}\x{993C}\x{993D}\x{993E}\x{993F}\x{9940}\x{9941}' + . '\x{9942}\x{9943}\x{9945}\x{9946}\x{9947}\x{9948}\x{9949}\x{994A}\x{994B}' + . '\x{994C}\x{994E}\x{994F}\x{9950}\x{9951}\x{9952}\x{9953}\x{9954}\x{9955}' + . '\x{9956}\x{9957}\x{9958}\x{9959}\x{995B}\x{995C}\x{995E}\x{995F}\x{9960}' + . '\x{9961}\x{9962}\x{9963}\x{9964}\x{9965}\x{9966}\x{9967}\x{9968}\x{9969}' + . '\x{996A}\x{996B}\x{996C}\x{996D}\x{996E}\x{996F}\x{9970}\x{9971}\x{9972}' + . '\x{9973}\x{9974}\x{9975}\x{9976}\x{9977}\x{9978}\x{9979}\x{997A}\x{997B}' + . '\x{997C}\x{997D}\x{997E}\x{997F}\x{9980}\x{9981}\x{9982}\x{9983}\x{9984}' + . '\x{9985}\x{9986}\x{9987}\x{9988}\x{9989}\x{998A}\x{998B}\x{998C}\x{998D}' + . '\x{998E}\x{998F}\x{9990}\x{9991}\x{9992}\x{9993}\x{9994}\x{9995}\x{9996}' + . '\x{9997}\x{9998}\x{9999}\x{999A}\x{999B}\x{999C}\x{999D}\x{999E}\x{999F}' + . '\x{99A0}\x{99A1}\x{99A2}\x{99A3}\x{99A4}\x{99A5}\x{99A6}\x{99A7}\x{99A8}' + . '\x{99A9}\x{99AA}\x{99AB}\x{99AC}\x{99AD}\x{99AE}\x{99AF}\x{99B0}\x{99B1}' + . '\x{99B2}\x{99B3}\x{99B4}\x{99B5}\x{99B6}\x{99B7}\x{99B8}\x{99B9}\x{99BA}' + . '\x{99BB}\x{99BC}\x{99BD}\x{99BE}\x{99C0}\x{99C1}\x{99C2}\x{99C3}\x{99C4}' + . '\x{99C6}\x{99C7}\x{99C8}\x{99C9}\x{99CA}\x{99CB}\x{99CC}\x{99CD}\x{99CE}' + . '\x{99CF}\x{99D0}\x{99D1}\x{99D2}\x{99D3}\x{99D4}\x{99D5}\x{99D6}\x{99D7}' + . '\x{99D8}\x{99D9}\x{99DA}\x{99DB}\x{99DC}\x{99DD}\x{99DE}\x{99DF}\x{99E1}' + . '\x{99E2}\x{99E3}\x{99E4}\x{99E5}\x{99E7}\x{99E8}\x{99E9}\x{99EA}\x{99EC}' + . '\x{99ED}\x{99EE}\x{99EF}\x{99F0}\x{99F1}\x{99F2}\x{99F3}\x{99F4}\x{99F6}' + . '\x{99F7}\x{99F8}\x{99F9}\x{99FA}\x{99FB}\x{99FC}\x{99FD}\x{99FE}\x{99FF}' + . '\x{9A00}\x{9A01}\x{9A02}\x{9A03}\x{9A04}\x{9A05}\x{9A06}\x{9A07}\x{9A08}' + . '\x{9A09}\x{9A0A}\x{9A0B}\x{9A0C}\x{9A0D}\x{9A0E}\x{9A0F}\x{9A11}\x{9A14}' + . '\x{9A15}\x{9A16}\x{9A19}\x{9A1A}\x{9A1B}\x{9A1C}\x{9A1D}\x{9A1E}\x{9A1F}' + . '\x{9A20}\x{9A21}\x{9A22}\x{9A23}\x{9A24}\x{9A25}\x{9A26}\x{9A27}\x{9A29}' + . '\x{9A2A}\x{9A2B}\x{9A2C}\x{9A2D}\x{9A2E}\x{9A2F}\x{9A30}\x{9A31}\x{9A32}' + . '\x{9A33}\x{9A34}\x{9A35}\x{9A36}\x{9A37}\x{9A38}\x{9A39}\x{9A3A}\x{9A3C}' + . '\x{9A3D}\x{9A3E}\x{9A3F}\x{9A40}\x{9A41}\x{9A42}\x{9A43}\x{9A44}\x{9A45}' + . '\x{9A46}\x{9A47}\x{9A48}\x{9A49}\x{9A4A}\x{9A4B}\x{9A4C}\x{9A4D}\x{9A4E}' + . '\x{9A4F}\x{9A50}\x{9A52}\x{9A53}\x{9A54}\x{9A55}\x{9A56}\x{9A57}\x{9A59}' + . '\x{9A5A}\x{9A5B}\x{9A5C}\x{9A5E}\x{9A5F}\x{9A60}\x{9A61}\x{9A62}\x{9A64}' + . '\x{9A65}\x{9A66}\x{9A67}\x{9A68}\x{9A69}\x{9A6A}\x{9A6B}\x{9A6C}\x{9A6D}' + . '\x{9A6E}\x{9A6F}\x{9A70}\x{9A71}\x{9A72}\x{9A73}\x{9A74}\x{9A75}\x{9A76}' + . '\x{9A77}\x{9A78}\x{9A79}\x{9A7A}\x{9A7B}\x{9A7C}\x{9A7D}\x{9A7E}\x{9A7F}' + . '\x{9A80}\x{9A81}\x{9A82}\x{9A83}\x{9A84}\x{9A85}\x{9A86}\x{9A87}\x{9A88}' + . '\x{9A89}\x{9A8A}\x{9A8B}\x{9A8C}\x{9A8D}\x{9A8E}\x{9A8F}\x{9A90}\x{9A91}' + . '\x{9A92}\x{9A93}\x{9A94}\x{9A95}\x{9A96}\x{9A97}\x{9A98}\x{9A99}\x{9A9A}' + . '\x{9A9B}\x{9A9C}\x{9A9D}\x{9A9E}\x{9A9F}\x{9AA0}\x{9AA1}\x{9AA2}\x{9AA3}' + . '\x{9AA4}\x{9AA5}\x{9AA6}\x{9AA7}\x{9AA8}\x{9AAA}\x{9AAB}\x{9AAC}\x{9AAD}' + . '\x{9AAE}\x{9AAF}\x{9AB0}\x{9AB1}\x{9AB2}\x{9AB3}\x{9AB4}\x{9AB5}\x{9AB6}' + . '\x{9AB7}\x{9AB8}\x{9AB9}\x{9ABA}\x{9ABB}\x{9ABC}\x{9ABE}\x{9ABF}\x{9AC0}' + . '\x{9AC1}\x{9AC2}\x{9AC3}\x{9AC4}\x{9AC5}\x{9AC6}\x{9AC7}\x{9AC9}\x{9ACA}' + . '\x{9ACB}\x{9ACC}\x{9ACD}\x{9ACE}\x{9ACF}\x{9AD0}\x{9AD1}\x{9AD2}\x{9AD3}' + . '\x{9AD4}\x{9AD5}\x{9AD6}\x{9AD8}\x{9AD9}\x{9ADA}\x{9ADB}\x{9ADC}\x{9ADD}' + . '\x{9ADE}\x{9ADF}\x{9AE1}\x{9AE2}\x{9AE3}\x{9AE5}\x{9AE6}\x{9AE7}\x{9AEA}' + . '\x{9AEB}\x{9AEC}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF2}\x{9AF3}\x{9AF4}' + . '\x{9AF5}\x{9AF6}\x{9AF7}\x{9AF8}\x{9AF9}\x{9AFA}\x{9AFB}\x{9AFC}\x{9AFD}' + . '\x{9AFE}\x{9AFF}\x{9B01}\x{9B03}\x{9B04}\x{9B05}\x{9B06}\x{9B07}\x{9B08}' + . '\x{9B0A}\x{9B0B}\x{9B0C}\x{9B0D}\x{9B0E}\x{9B0F}\x{9B10}\x{9B11}\x{9B12}' + . '\x{9B13}\x{9B15}\x{9B16}\x{9B17}\x{9B18}\x{9B19}\x{9B1A}\x{9B1C}\x{9B1D}' + . '\x{9B1E}\x{9B1F}\x{9B20}\x{9B21}\x{9B22}\x{9B23}\x{9B24}\x{9B25}\x{9B26}' + . '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2B}\x{9B2C}\x{9B2D}\x{9B2E}\x{9B2F}' + . '\x{9B30}\x{9B31}\x{9B32}\x{9B33}\x{9B35}\x{9B36}\x{9B37}\x{9B38}\x{9B39}' + . '\x{9B3A}\x{9B3B}\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}\x{9B42}\x{9B43}\x{9B44}' + . '\x{9B45}\x{9B46}\x{9B47}\x{9B48}\x{9B49}\x{9B4A}\x{9B4B}\x{9B4C}\x{9B4D}' + . '\x{9B4E}\x{9B4F}\x{9B51}\x{9B52}\x{9B53}\x{9B54}\x{9B55}\x{9B56}\x{9B58}' + . '\x{9B59}\x{9B5A}\x{9B5B}\x{9B5C}\x{9B5D}\x{9B5E}\x{9B5F}\x{9B60}\x{9B61}' + . '\x{9B63}\x{9B64}\x{9B65}\x{9B66}\x{9B67}\x{9B68}\x{9B69}\x{9B6A}\x{9B6B}' + . '\x{9B6C}\x{9B6D}\x{9B6E}\x{9B6F}\x{9B70}\x{9B71}\x{9B73}\x{9B74}\x{9B75}' + . '\x{9B76}\x{9B77}\x{9B78}\x{9B79}\x{9B7A}\x{9B7B}\x{9B7C}\x{9B7D}\x{9B7E}' + . '\x{9B7F}\x{9B80}\x{9B81}\x{9B82}\x{9B83}\x{9B84}\x{9B85}\x{9B86}\x{9B87}' + . '\x{9B88}\x{9B8A}\x{9B8B}\x{9B8D}\x{9B8E}\x{9B8F}\x{9B90}\x{9B91}\x{9B92}' + . '\x{9B93}\x{9B94}\x{9B95}\x{9B96}\x{9B97}\x{9B98}\x{9B9A}\x{9B9B}\x{9B9C}' + . '\x{9B9D}\x{9B9E}\x{9B9F}\x{9BA0}\x{9BA1}\x{9BA2}\x{9BA3}\x{9BA4}\x{9BA5}' + . '\x{9BA6}\x{9BA7}\x{9BA8}\x{9BA9}\x{9BAA}\x{9BAB}\x{9BAC}\x{9BAD}\x{9BAE}' + . '\x{9BAF}\x{9BB0}\x{9BB1}\x{9BB2}\x{9BB3}\x{9BB4}\x{9BB5}\x{9BB6}\x{9BB7}' + . '\x{9BB8}\x{9BB9}\x{9BBA}\x{9BBB}\x{9BBC}\x{9BBD}\x{9BBE}\x{9BBF}\x{9BC0}' + . '\x{9BC1}\x{9BC3}\x{9BC4}\x{9BC5}\x{9BC6}\x{9BC7}\x{9BC8}\x{9BC9}\x{9BCA}' + . '\x{9BCB}\x{9BCC}\x{9BCD}\x{9BCE}\x{9BCF}\x{9BD0}\x{9BD1}\x{9BD2}\x{9BD3}' + . '\x{9BD4}\x{9BD5}\x{9BD6}\x{9BD7}\x{9BD8}\x{9BD9}\x{9BDA}\x{9BDB}\x{9BDC}' + . '\x{9BDD}\x{9BDE}\x{9BDF}\x{9BE0}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}\x{9BE5}' + . '\x{9BE6}\x{9BE7}\x{9BE8}\x{9BE9}\x{9BEA}\x{9BEB}\x{9BEC}\x{9BED}\x{9BEE}' + . '\x{9BEF}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF3}\x{9BF4}\x{9BF5}\x{9BF7}\x{9BF8}' + . '\x{9BF9}\x{9BFA}\x{9BFB}\x{9BFC}\x{9BFD}\x{9BFE}\x{9BFF}\x{9C02}\x{9C05}' + . '\x{9C06}\x{9C07}\x{9C08}\x{9C09}\x{9C0A}\x{9C0B}\x{9C0C}\x{9C0D}\x{9C0E}' + . '\x{9C0F}\x{9C10}\x{9C11}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C16}\x{9C17}' + . '\x{9C18}\x{9C19}\x{9C1A}\x{9C1B}\x{9C1C}\x{9C1D}\x{9C1E}\x{9C1F}\x{9C20}' + . '\x{9C21}\x{9C22}\x{9C23}\x{9C24}\x{9C25}\x{9C26}\x{9C27}\x{9C28}\x{9C29}' + . '\x{9C2A}\x{9C2B}\x{9C2C}\x{9C2D}\x{9C2F}\x{9C30}\x{9C31}\x{9C32}\x{9C33}' + . '\x{9C34}\x{9C35}\x{9C36}\x{9C37}\x{9C38}\x{9C39}\x{9C3A}\x{9C3B}\x{9C3C}' + . '\x{9C3D}\x{9C3E}\x{9C3F}\x{9C40}\x{9C41}\x{9C43}\x{9C44}\x{9C45}\x{9C46}' + . '\x{9C47}\x{9C48}\x{9C49}\x{9C4A}\x{9C4B}\x{9C4C}\x{9C4D}\x{9C4E}\x{9C50}' + . '\x{9C52}\x{9C53}\x{9C54}\x{9C55}\x{9C56}\x{9C57}\x{9C58}\x{9C59}\x{9C5A}' + . '\x{9C5B}\x{9C5C}\x{9C5D}\x{9C5E}\x{9C5F}\x{9C60}\x{9C62}\x{9C63}\x{9C65}' + . '\x{9C66}\x{9C67}\x{9C68}\x{9C69}\x{9C6A}\x{9C6B}\x{9C6C}\x{9C6D}\x{9C6E}' + . '\x{9C6F}\x{9C70}\x{9C71}\x{9C72}\x{9C73}\x{9C74}\x{9C75}\x{9C77}\x{9C78}' + . '\x{9C79}\x{9C7A}\x{9C7C}\x{9C7D}\x{9C7E}\x{9C7F}\x{9C80}\x{9C81}\x{9C82}' + . '\x{9C83}\x{9C84}\x{9C85}\x{9C86}\x{9C87}\x{9C88}\x{9C89}\x{9C8A}\x{9C8B}' + . '\x{9C8C}\x{9C8D}\x{9C8E}\x{9C8F}\x{9C90}\x{9C91}\x{9C92}\x{9C93}\x{9C94}' + . '\x{9C95}\x{9C96}\x{9C97}\x{9C98}\x{9C99}\x{9C9A}\x{9C9B}\x{9C9C}\x{9C9D}' + . '\x{9C9E}\x{9C9F}\x{9CA0}\x{9CA1}\x{9CA2}\x{9CA3}\x{9CA4}\x{9CA5}\x{9CA6}' + . '\x{9CA7}\x{9CA8}\x{9CA9}\x{9CAA}\x{9CAB}\x{9CAC}\x{9CAD}\x{9CAE}\x{9CAF}' + . '\x{9CB0}\x{9CB1}\x{9CB2}\x{9CB3}\x{9CB4}\x{9CB5}\x{9CB6}\x{9CB7}\x{9CB8}' + . '\x{9CB9}\x{9CBA}\x{9CBB}\x{9CBC}\x{9CBD}\x{9CBE}\x{9CBF}\x{9CC0}\x{9CC1}' + . '\x{9CC2}\x{9CC3}\x{9CC4}\x{9CC5}\x{9CC6}\x{9CC7}\x{9CC8}\x{9CC9}\x{9CCA}' + . '\x{9CCB}\x{9CCC}\x{9CCD}\x{9CCE}\x{9CCF}\x{9CD0}\x{9CD1}\x{9CD2}\x{9CD3}' + . '\x{9CD4}\x{9CD5}\x{9CD6}\x{9CD7}\x{9CD8}\x{9CD9}\x{9CDA}\x{9CDB}\x{9CDC}' + . '\x{9CDD}\x{9CDE}\x{9CDF}\x{9CE0}\x{9CE1}\x{9CE2}\x{9CE3}\x{9CE4}\x{9CE5}' + . '\x{9CE6}\x{9CE7}\x{9CE8}\x{9CE9}\x{9CEA}\x{9CEB}\x{9CEC}\x{9CED}\x{9CEE}' + . '\x{9CEF}\x{9CF0}\x{9CF1}\x{9CF2}\x{9CF3}\x{9CF4}\x{9CF5}\x{9CF6}\x{9CF7}' + . '\x{9CF8}\x{9CF9}\x{9CFA}\x{9CFB}\x{9CFC}\x{9CFD}\x{9CFE}\x{9CFF}\x{9D00}' + . '\x{9D01}\x{9D02}\x{9D03}\x{9D04}\x{9D05}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' + . '\x{9D0A}\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}\x{9D13}\x{9D14}\x{9D15}\x{9D16}' + . '\x{9D17}\x{9D18}\x{9D19}\x{9D1A}\x{9D1B}\x{9D1C}\x{9D1D}\x{9D1E}\x{9D1F}' + . '\x{9D20}\x{9D21}\x{9D22}\x{9D23}\x{9D24}\x{9D25}\x{9D26}\x{9D28}\x{9D29}' + . '\x{9D2B}\x{9D2D}\x{9D2E}\x{9D2F}\x{9D30}\x{9D31}\x{9D32}\x{9D33}\x{9D34}' + . '\x{9D36}\x{9D37}\x{9D38}\x{9D39}\x{9D3A}\x{9D3B}\x{9D3D}\x{9D3E}\x{9D3F}' + . '\x{9D40}\x{9D41}\x{9D42}\x{9D43}\x{9D45}\x{9D46}\x{9D47}\x{9D48}\x{9D49}' + . '\x{9D4A}\x{9D4B}\x{9D4C}\x{9D4D}\x{9D4E}\x{9D4F}\x{9D50}\x{9D51}\x{9D52}' + . '\x{9D53}\x{9D54}\x{9D55}\x{9D56}\x{9D57}\x{9D58}\x{9D59}\x{9D5A}\x{9D5B}' + . '\x{9D5C}\x{9D5D}\x{9D5E}\x{9D5F}\x{9D60}\x{9D61}\x{9D62}\x{9D63}\x{9D64}' + . '\x{9D65}\x{9D66}\x{9D67}\x{9D68}\x{9D69}\x{9D6A}\x{9D6B}\x{9D6C}\x{9D6E}' + . '\x{9D6F}\x{9D70}\x{9D71}\x{9D72}\x{9D73}\x{9D74}\x{9D75}\x{9D76}\x{9D77}' + . '\x{9D78}\x{9D79}\x{9D7A}\x{9D7B}\x{9D7C}\x{9D7D}\x{9D7E}\x{9D7F}\x{9D80}' + . '\x{9D81}\x{9D82}\x{9D83}\x{9D84}\x{9D85}\x{9D86}\x{9D87}\x{9D88}\x{9D89}' + . '\x{9D8A}\x{9D8B}\x{9D8C}\x{9D8D}\x{9D8E}\x{9D90}\x{9D91}\x{9D92}\x{9D93}' + . '\x{9D94}\x{9D96}\x{9D97}\x{9D98}\x{9D99}\x{9D9A}\x{9D9B}\x{9D9C}\x{9D9D}' + . '\x{9D9E}\x{9D9F}\x{9DA0}\x{9DA1}\x{9DA2}\x{9DA3}\x{9DA4}\x{9DA5}\x{9DA6}' + . '\x{9DA7}\x{9DA8}\x{9DA9}\x{9DAA}\x{9DAB}\x{9DAC}\x{9DAD}\x{9DAF}\x{9DB0}' + . '\x{9DB1}\x{9DB2}\x{9DB3}\x{9DB4}\x{9DB5}\x{9DB6}\x{9DB7}\x{9DB8}\x{9DB9}' + . '\x{9DBA}\x{9DBB}\x{9DBC}\x{9DBE}\x{9DBF}\x{9DC1}\x{9DC2}\x{9DC3}\x{9DC4}' + . '\x{9DC5}\x{9DC7}\x{9DC8}\x{9DC9}\x{9DCA}\x{9DCB}\x{9DCC}\x{9DCD}\x{9DCE}' + . '\x{9DCF}\x{9DD0}\x{9DD1}\x{9DD2}\x{9DD3}\x{9DD4}\x{9DD5}\x{9DD6}\x{9DD7}' + . '\x{9DD8}\x{9DD9}\x{9DDA}\x{9DDB}\x{9DDC}\x{9DDD}\x{9DDE}\x{9DDF}\x{9DE0}' + . '\x{9DE1}\x{9DE2}\x{9DE3}\x{9DE4}\x{9DE5}\x{9DE6}\x{9DE7}\x{9DE8}\x{9DE9}' + . '\x{9DEB}\x{9DEC}\x{9DED}\x{9DEE}\x{9DEF}\x{9DF0}\x{9DF1}\x{9DF2}\x{9DF3}' + . '\x{9DF4}\x{9DF5}\x{9DF6}\x{9DF7}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFB}\x{9DFD}' + . '\x{9DFE}\x{9DFF}\x{9E00}\x{9E01}\x{9E02}\x{9E03}\x{9E04}\x{9E05}\x{9E06}' + . '\x{9E07}\x{9E08}\x{9E09}\x{9E0A}\x{9E0B}\x{9E0C}\x{9E0D}\x{9E0F}\x{9E10}' + . '\x{9E11}\x{9E12}\x{9E13}\x{9E14}\x{9E15}\x{9E17}\x{9E18}\x{9E19}\x{9E1A}' + . '\x{9E1B}\x{9E1D}\x{9E1E}\x{9E1F}\x{9E20}\x{9E21}\x{9E22}\x{9E23}\x{9E24}' + . '\x{9E25}\x{9E26}\x{9E27}\x{9E28}\x{9E29}\x{9E2A}\x{9E2B}\x{9E2C}\x{9E2D}' + . '\x{9E2E}\x{9E2F}\x{9E30}\x{9E31}\x{9E32}\x{9E33}\x{9E34}\x{9E35}\x{9E36}' + . '\x{9E37}\x{9E38}\x{9E39}\x{9E3A}\x{9E3B}\x{9E3C}\x{9E3D}\x{9E3E}\x{9E3F}' + . '\x{9E40}\x{9E41}\x{9E42}\x{9E43}\x{9E44}\x{9E45}\x{9E46}\x{9E47}\x{9E48}' + . '\x{9E49}\x{9E4A}\x{9E4B}\x{9E4C}\x{9E4D}\x{9E4E}\x{9E4F}\x{9E50}\x{9E51}' + . '\x{9E52}\x{9E53}\x{9E54}\x{9E55}\x{9E56}\x{9E57}\x{9E58}\x{9E59}\x{9E5A}' + . '\x{9E5B}\x{9E5C}\x{9E5D}\x{9E5E}\x{9E5F}\x{9E60}\x{9E61}\x{9E62}\x{9E63}' + . '\x{9E64}\x{9E65}\x{9E66}\x{9E67}\x{9E68}\x{9E69}\x{9E6A}\x{9E6B}\x{9E6C}' + . '\x{9E6D}\x{9E6E}\x{9E6F}\x{9E70}\x{9E71}\x{9E72}\x{9E73}\x{9E74}\x{9E75}' + . '\x{9E76}\x{9E77}\x{9E79}\x{9E7A}\x{9E7C}\x{9E7D}\x{9E7E}\x{9E7F}\x{9E80}' + . '\x{9E81}\x{9E82}\x{9E83}\x{9E84}\x{9E85}\x{9E86}\x{9E87}\x{9E88}\x{9E89}' + . '\x{9E8A}\x{9E8B}\x{9E8C}\x{9E8D}\x{9E8E}\x{9E91}\x{9E92}\x{9E93}\x{9E94}' + . '\x{9E96}\x{9E97}\x{9E99}\x{9E9A}\x{9E9B}\x{9E9C}\x{9E9D}\x{9E9F}\x{9EA0}' + . '\x{9EA1}\x{9EA3}\x{9EA4}\x{9EA5}\x{9EA6}\x{9EA7}\x{9EA8}\x{9EA9}\x{9EAA}' + . '\x{9EAD}\x{9EAE}\x{9EAF}\x{9EB0}\x{9EB2}\x{9EB3}\x{9EB4}\x{9EB5}\x{9EB6}' + . '\x{9EB7}\x{9EB8}\x{9EBB}\x{9EBC}\x{9EBD}\x{9EBE}\x{9EBF}\x{9EC0}\x{9EC1}' + . '\x{9EC2}\x{9EC3}\x{9EC4}\x{9EC5}\x{9EC6}\x{9EC7}\x{9EC8}\x{9EC9}\x{9ECA}' + . '\x{9ECB}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED1}\x{9ED2}\x{9ED3}' + . '\x{9ED4}\x{9ED5}\x{9ED6}\x{9ED7}\x{9ED8}\x{9ED9}\x{9EDA}\x{9EDB}\x{9EDC}' + . '\x{9EDD}\x{9EDE}\x{9EDF}\x{9EE0}\x{9EE1}\x{9EE2}\x{9EE3}\x{9EE4}\x{9EE5}' + . '\x{9EE6}\x{9EE7}\x{9EE8}\x{9EE9}\x{9EEA}\x{9EEB}\x{9EED}\x{9EEE}\x{9EEF}' + . '\x{9EF0}\x{9EF2}\x{9EF3}\x{9EF4}\x{9EF5}\x{9EF6}\x{9EF7}\x{9EF8}\x{9EF9}' + . '\x{9EFA}\x{9EFB}\x{9EFC}\x{9EFD}\x{9EFE}\x{9EFF}\x{9F00}\x{9F01}\x{9F02}' + . '\x{9F04}\x{9F05}\x{9F06}\x{9F07}\x{9F08}\x{9F09}\x{9F0A}\x{9F0B}\x{9F0C}' + . '\x{9F0D}\x{9F0E}\x{9F0F}\x{9F10}\x{9F12}\x{9F13}\x{9F15}\x{9F16}\x{9F17}' + . '\x{9F18}\x{9F19}\x{9F1A}\x{9F1B}\x{9F1C}\x{9F1D}\x{9F1E}\x{9F1F}\x{9F20}' + . '\x{9F22}\x{9F23}\x{9F24}\x{9F25}\x{9F27}\x{9F28}\x{9F29}\x{9F2A}\x{9F2B}' + . '\x{9F2C}\x{9F2D}\x{9F2E}\x{9F2F}\x{9F30}\x{9F31}\x{9F32}\x{9F33}\x{9F34}' + . '\x{9F35}\x{9F36}\x{9F37}\x{9F38}\x{9F39}\x{9F3A}\x{9F3B}\x{9F3C}\x{9F3D}' + . '\x{9F3E}\x{9F3F}\x{9F40}\x{9F41}\x{9F42}\x{9F43}\x{9F44}\x{9F46}\x{9F47}' + . '\x{9F48}\x{9F49}\x{9F4A}\x{9F4B}\x{9F4C}\x{9F4D}\x{9F4E}\x{9F4F}\x{9F50}' + . '\x{9F51}\x{9F52}\x{9F54}\x{9F55}\x{9F56}\x{9F57}\x{9F58}\x{9F59}\x{9F5A}' + . '\x{9F5B}\x{9F5C}\x{9F5D}\x{9F5E}\x{9F5F}\x{9F60}\x{9F61}\x{9F63}\x{9F64}' + . '\x{9F65}\x{9F66}\x{9F67}\x{9F68}\x{9F69}\x{9F6A}\x{9F6B}\x{9F6C}\x{9F6E}' + . '\x{9F6F}\x{9F70}\x{9F71}\x{9F72}\x{9F73}\x{9F74}\x{9F75}\x{9F76}\x{9F77}' + . '\x{9F78}\x{9F79}\x{9F7A}\x{9F7B}\x{9F7C}\x{9F7D}\x{9F7E}\x{9F7F}\x{9F80}' + . '\x{9F81}\x{9F82}\x{9F83}\x{9F84}\x{9F85}\x{9F86}\x{9F87}\x{9F88}\x{9F89}' + . '\x{9F8A}\x{9F8B}\x{9F8C}\x{9F8D}\x{9F8E}\x{9F8F}\x{9F90}\x{9F91}\x{9F92}' + . '\x{9F93}\x{9F94}\x{9F95}\x{9F96}\x{9F97}\x{9F98}\x{9F99}\x{9F9A}\x{9F9B}' + . '\x{9F9C}\x{9F9D}\x{9F9E}\x{9F9F}\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu', +]; diff --git a/vendor/laminas/laminas-validator/src/Hostname/Com.php b/vendor/laminas/laminas-validator/src/Hostname/Com.php new file mode 100644 index 00000000..5db58df6 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Hostname/Com.php @@ -0,0 +1,176 @@ + '/^[\x{002d}0-9\x{0400}-\x{052f}]{1,63}$/iu', + 2 => '/^[\x{002d}0-9\x{0370}-\x{03ff}]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-z\x{ac00}-\x{d7a3}]{1,17}$/iu', + // @codingStandardsIgnoreStart + 4 => '/^[\x{002d}0-9a-z·à-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž]{1,63}$/iu', + // @codingStandardsIgnoreEnd + 5 => '/^[\x{002d}0-9A-Za-z\x{3400}-\x{3401}\x{3404}-\x{3406}\x{340C}\x{3416}\x{341C}' +. '\x{3421}\x{3424}\x{3428}-\x{3429}\x{342B}-\x{342E}\x{3430}-\x{3434}\x{3436}' +. '\x{3438}-\x{343C}\x{343E}\x{3441}-\x{3445}\x{3447}\x{3449}-\x{3451}\x{3453}' +. '\x{3457}-\x{345F}\x{3463}-\x{3467}\x{346E}-\x{3471}\x{3473}-\x{3477}\x{3479}-\x{348E}\x{3491}-\x{3497}' +. '\x{3499}-\x{34A1}\x{34A4}-\x{34AD}\x{34AF}-\x{34B0}\x{34B2}-\x{34BF}\x{34C2}-\x{34C5}\x{34C7}-\x{34CC}' +. '\x{34CE}-\x{34D1}\x{34D3}-\x{34D8}\x{34DA}-\x{34E4}\x{34E7}-\x{34E9}\x{34EC}-\x{34EF}\x{34F1}-\x{34FE}' +. '\x{3500}-\x{3507}\x{350A}-\x{3513}\x{3515}\x{3517}-\x{351A}\x{351C}-\x{351E}\x{3520}-\x{352A}' +. '\x{352C}-\x{3552}\x{3554}-\x{355C}\x{355E}-\x{3567}\x{3569}-\x{3573}\x{3575}-\x{357C}\x{3580}-\x{3588}' +. '\x{358F}-\x{3598}\x{359E}-\x{35AB}\x{35B4}-\x{35CD}\x{35D0}\x{35D3}-\x{35DC}\x{35E2}-\x{35ED}' +. '\x{35F0}-\x{35F6}\x{35FB}-\x{3602}\x{3605}-\x{360E}\x{3610}-\x{3611}\x{3613}-\x{3616}\x{3619}-\x{362D}' +. '\x{362F}-\x{3634}\x{3636}-\x{363B}\x{363F}-\x{3645}\x{3647}-\x{364B}\x{364D}-\x{3653}\x{3655}' +. '\x{3659}-\x{365E}\x{3660}-\x{3665}\x{3667}-\x{367C}\x{367E}\x{3680}-\x{3685}\x{3687}' +. '\x{3689}-\x{3690}\x{3692}-\x{3698}\x{369A}\x{369C}-\x{36AE}\x{36B0}-\x{36BF}\x{36C1}-\x{36C5}' +. '\x{36C9}-\x{36CA}\x{36CD}-\x{36DE}\x{36E1}-\x{36E2}\x{36E5}-\x{36FE}\x{3701}-\x{3713}\x{3715}-\x{371E}' +. '\x{3720}-\x{372C}\x{372E}-\x{3745}\x{3747}-\x{3748}\x{374A}\x{374C}-\x{3759}\x{375B}-\x{3760}' +. '\x{3762}-\x{3767}\x{3769}-\x{3772}\x{3774}-\x{378C}\x{378F}-\x{379C}\x{379F}\x{37A1}-\x{37AD}' +. '\x{37AF}-\x{37B7}\x{37B9}-\x{37C1}\x{37C3}-\x{37C5}\x{37C7}-\x{37D4}\x{37D6}-\x{37E0}\x{37E2}' +. '\x{37E5}-\x{37ED}\x{37EF}-\x{37F6}\x{37F8}-\x{3802}\x{3804}-\x{381D}\x{3820}-\x{3822}\x{3825}-\x{382A}' +. '\x{382D}-\x{382F}\x{3831}-\x{3832}\x{3834}-\x{384C}\x{384E}-\x{3860}\x{3862}-\x{3863}\x{3865}-\x{386B}' +. '\x{386D}-\x{3886}\x{3888}-\x{38A1}\x{38A3}\x{38A5}-\x{38AA}\x{38AC}\x{38AE}-\x{38B0}' +. '\x{38B2}-\x{38B6}\x{38B8}\x{38BA}-\x{38BE}\x{38C0}-\x{38C9}\x{38CB}-\x{38D4}\x{38D8}-\x{38E0}' +. '\x{38E2}-\x{38E6}\x{38EB}-\x{38ED}\x{38EF}-\x{38F2}\x{38F5}-\x{38F7}\x{38FA}-\x{38FF}\x{3901}-\x{392A}' +. '\x{392C}\x{392E}-\x{393B}\x{393E}-\x{3956}\x{395A}-\x{3969}\x{396B}-\x{397A}\x{397C}-\x{3987}' +. '\x{3989}-\x{3998}\x{399A}-\x{39B0}\x{39B2}\x{39B4}-\x{39D0}\x{39D2}-\x{39DA}\x{39DE}-\x{39DF}' +. '\x{39E1}-\x{39EF}\x{39F1}-\x{3A17}\x{3A19}-\x{3A2A}\x{3A2D}-\x{3A40}\x{3A43}-\x{3A4E}\x{3A50}' +. '\x{3A52}-\x{3A5E}\x{3A60}-\x{3A6D}\x{3A6F}-\x{3A77}\x{3A79}-\x{3A82}\x{3A84}-\x{3A85}\x{3A87}-\x{3A89}' +. '\x{3A8B}-\x{3A8F}\x{3A91}-\x{3A93}\x{3A95}-\x{3A96}\x{3A9A}\x{3A9C}-\x{3AA6}\x{3AA8}-\x{3AA9}' +. '\x{3AAB}-\x{3AB1}\x{3AB4}-\x{3ABC}\x{3ABE}-\x{3AC5}\x{3ACA}-\x{3ACB}\x{3ACD}-\x{3AD5}\x{3AD7}-\x{3AE1}' +. '\x{3AE4}-\x{3AE7}\x{3AE9}-\x{3AEC}\x{3AEE}-\x{3AFD}\x{3B01}-\x{3B10}\x{3B12}-\x{3B15}\x{3B17}-\x{3B1E}' +. '\x{3B20}-\x{3B23}\x{3B25}-\x{3B27}\x{3B29}-\x{3B36}\x{3B38}-\x{3B39}\x{3B3B}-\x{3B3C}\x{3B3F}' +. '\x{3B41}-\x{3B44}\x{3B47}-\x{3B4C}\x{3B4E}\x{3B51}-\x{3B55}\x{3B58}-\x{3B62}\x{3B68}-\x{3B72}' +. '\x{3B78}-\x{3B88}\x{3B8B}-\x{3B9F}\x{3BA1}\x{3BA3}-\x{3BBA}\x{3BBC}\x{3BBF}-\x{3BD0}' +. '\x{3BD3}-\x{3BE6}\x{3BEA}-\x{3BFB}\x{3BFE}-\x{3C12}\x{3C14}-\x{3C1B}\x{3C1D}-\x{3C37}\x{3C39}-\x{3C4F}' +. '\x{3C52}\x{3C54}-\x{3C5C}\x{3C5E}-\x{3C68}\x{3C6A}-\x{3C76}\x{3C78}-\x{3C8F}\x{3C91}-\x{3CA8}' +. '\x{3CAA}-\x{3CAD}\x{3CAF}-\x{3CBE}\x{3CC0}-\x{3CC8}\x{3CCA}-\x{3CD3}\x{3CD6}-\x{3CE0}\x{3CE4}-\x{3CEE}' +. '\x{3CF3}-\x{3D0A}\x{3D0E}-\x{3D1E}\x{3D20}-\x{3D21}\x{3D25}-\x{3D38}\x{3D3B}-\x{3D46}\x{3D4A}-\x{3D59}' +. '\x{3D5D}-\x{3D7B}\x{3D7D}-\x{3D81}\x{3D84}-\x{3D88}\x{3D8C}-\x{3D8F}\x{3D91}-\x{3D98}\x{3D9A}-\x{3D9C}' +. '\x{3D9E}-\x{3DA1}\x{3DA3}-\x{3DB0}\x{3DB2}-\x{3DB5}\x{3DB9}-\x{3DBC}\x{3DBE}-\x{3DCB}\x{3DCD}-\x{3DDB}' +. '\x{3DDF}-\x{3DE8}\x{3DEB}-\x{3DF0}\x{3DF3}-\x{3DF9}\x{3DFB}-\x{3DFC}\x{3DFE}-\x{3E05}\x{3E08}-\x{3E33}' +. '\x{3E35}-\x{3E3E}\x{3E40}-\x{3E47}\x{3E49}-\x{3E67}\x{3E6B}-\x{3E6F}\x{3E71}-\x{3E85}\x{3E87}-\x{3E8C}' +. '\x{3E8E}-\x{3E98}\x{3E9A}-\x{3EA1}\x{3EA3}-\x{3EAE}\x{3EB0}-\x{3EB5}\x{3EB7}-\x{3EBA}\x{3EBD}' +. '\x{3EBF}-\x{3EC4}\x{3EC7}-\x{3ECE}\x{3ED1}-\x{3ED7}\x{3ED9}-\x{3EDA}\x{3EDD}-\x{3EE3}\x{3EE7}-\x{3EE8}' +. '\x{3EEB}-\x{3EF2}\x{3EF5}-\x{3EFF}\x{3F01}-\x{3F02}\x{3F04}-\x{3F07}\x{3F09}-\x{3F44}\x{3F46}-\x{3F4E}' +. '\x{3F50}-\x{3F53}\x{3F55}-\x{3F72}\x{3F74}-\x{3F75}\x{3F77}-\x{3F7B}\x{3F7D}-\x{3FB0}\x{3FB6}-\x{3FBF}' +. '\x{3FC1}-\x{3FCF}\x{3FD1}-\x{3FD3}\x{3FD5}-\x{3FDF}\x{3FE1}-\x{400B}\x{400D}-\x{401C}\x{401E}-\x{4024}' +. '\x{4027}-\x{403F}\x{4041}-\x{4060}\x{4062}-\x{4069}\x{406B}-\x{408A}\x{408C}-\x{40A7}\x{40A9}-\x{40B4}' +. '\x{40B6}-\x{40C2}\x{40C7}-\x{40CF}\x{40D1}-\x{40DE}\x{40E0}-\x{40E7}\x{40E9}-\x{40EE}\x{40F0}-\x{40FB}' +. '\x{40FD}-\x{4109}\x{410B}-\x{4115}\x{4118}-\x{411D}\x{411F}-\x{4122}\x{4124}-\x{4133}\x{4136}-\x{4138}' +. '\x{413A}-\x{4148}\x{414A}-\x{4169}\x{416C}-\x{4185}\x{4188}-\x{418B}\x{418D}-\x{41AD}\x{41AF}-\x{41B3}' +. '\x{41B5}-\x{41C3}\x{41C5}-\x{41C9}\x{41CB}-\x{41F2}\x{41F5}-\x{41FE}\x{4200}-\x{4227}\x{422A}-\x{4246}' +. '\x{4248}-\x{4263}\x{4265}-\x{428B}\x{428D}-\x{42A1}\x{42A3}-\x{42C4}\x{42C8}-\x{42DC}\x{42DE}-\x{430A}' +. '\x{430C}-\x{4335}\x{4337}\x{4342}-\x{435F}\x{4361}-\x{439A}\x{439C}-\x{439D}\x{439F}-\x{43A4}' +. '\x{43A6}-\x{43EC}\x{43EF}-\x{4405}\x{4407}-\x{4429}\x{442B}-\x{4455}\x{4457}-\x{4468}\x{446A}-\x{446D}' +. '\x{446F}-\x{4476}\x{4479}-\x{447D}\x{447F}-\x{4486}\x{4488}-\x{4490}\x{4492}-\x{4498}\x{449A}-\x{44AD}' +. '\x{44B0}-\x{44BD}\x{44C1}-\x{44D3}\x{44D6}-\x{44E7}\x{44EA}\x{44EC}-\x{44FA}\x{44FC}-\x{4541}' +. '\x{4543}-\x{454F}\x{4551}-\x{4562}\x{4564}-\x{4575}\x{4577}-\x{45AB}\x{45AD}-\x{45BD}\x{45BF}-\x{45D5}' +. '\x{45D7}-\x{45EC}\x{45EE}-\x{45F2}\x{45F4}-\x{45FA}\x{45FC}-\x{461A}\x{461C}-\x{461D}\x{461F}-\x{4631}' +. '\x{4633}-\x{4649}\x{464C}\x{464E}-\x{4652}\x{4654}-\x{466A}\x{466C}-\x{4675}\x{4677}-\x{467A}' +. '\x{467C}-\x{4694}\x{4696}-\x{46A3}\x{46A5}-\x{46AB}\x{46AD}-\x{46D2}\x{46D4}-\x{4723}\x{4729}-\x{4732}' +. '\x{4734}-\x{4758}\x{475A}\x{475C}-\x{478B}\x{478D}\x{4791}-\x{47B1}\x{47B3}-\x{47F1}' +. '\x{47F3}-\x{480B}\x{480D}-\x{4815}\x{4817}-\x{4839}\x{483B}-\x{4870}\x{4872}-\x{487A}\x{487C}-\x{487F}' +. '\x{4883}-\x{488E}\x{4890}-\x{4896}\x{4899}-\x{48A2}\x{48A4}-\x{48B9}\x{48BB}-\x{48C8}\x{48CA}-\x{48D1}' +. '\x{48D3}-\x{48E5}\x{48E7}-\x{48F2}\x{48F4}-\x{48FF}\x{4901}-\x{4922}\x{4924}-\x{4928}\x{492A}-\x{4931}' +. '\x{4933}-\x{495B}\x{495D}-\x{4978}\x{497A}\x{497D}\x{4982}-\x{4983}\x{4985}-\x{49A8}' +. '\x{49AA}-\x{49AF}\x{49B1}-\x{49B7}\x{49B9}-\x{49BD}\x{49C1}-\x{49C7}\x{49C9}-\x{49CE}\x{49D0}-\x{49E8}' +. '\x{49EA}\x{49EC}\x{49EE}-\x{4A19}\x{4A1B}-\x{4A43}\x{4A45}-\x{4A4D}\x{4A4F}-\x{4A9E}' +. '\x{4AA0}-\x{4AA9}\x{4AAB}-\x{4B4E}\x{4B50}-\x{4B5B}\x{4B5D}-\x{4B69}\x{4B6B}-\x{4BC2}\x{4BC6}-\x{4BE8}' +. '\x{4BEA}-\x{4BFA}\x{4BFC}-\x{4C06}\x{4C08}-\x{4C2D}\x{4C2F}-\x{4C32}\x{4C34}-\x{4C35}\x{4C37}-\x{4C69}' +. '\x{4C6B}-\x{4C73}\x{4C75}-\x{4C86}\x{4C88}-\x{4C97}\x{4C99}-\x{4C9C}\x{4C9F}-\x{4CA3}\x{4CA5}-\x{4CB5}' +. '\x{4CB7}-\x{4CF8}\x{4CFA}-\x{4D27}\x{4D29}-\x{4DAC}\x{4DAE}-\x{4DB1}\x{4DB3}-\x{4DB5}\x{4E00}-\x{4E54}' +. '\x{4E56}-\x{4E89}\x{4E8B}-\x{4EEC}\x{4EEE}-\x{4FAC}\x{4FAE}-\x{503C}\x{503E}-\x{51E5}\x{51E7}-\x{5270}' +. '\x{5272}-\x{56A1}\x{56A3}-\x{5840}\x{5842}-\x{58B5}\x{58B7}-\x{58CB}\x{58CD}-\x{5BC8}\x{5BCA}-\x{5C01}' +. '\x{5C03}-\x{5C25}\x{5C27}-\x{5D5B}\x{5D5D}-\x{5F08}\x{5F0A}-\x{61F3}\x{61F5}-\x{63BA}\x{63BC}-\x{6441}' +. '\x{6443}-\x{657C}\x{657E}-\x{663E}\x{6640}-\x{66FC}\x{66FE}-\x{6728}\x{672A}-\x{6766}\x{6768}-\x{67A8}' +. '\x{67AA}-\x{685B}\x{685D}-\x{685E}\x{6860}-\x{68B9}\x{68BB}-\x{6AC8}\x{6ACA}-\x{6BB0}\x{6BB2}-\x{6C16}' +. '\x{6C18}-\x{6D9B}\x{6D9D}-\x{6E12}\x{6E14}-\x{6E8B}\x{6E8D}-\x{704D}\x{704F}-\x{7113}\x{7115}-\x{713B}' +. '\x{713D}-\x{7154}\x{7156}-\x{729F}\x{72A1}-\x{731E}\x{7320}-\x{7362}\x{7364}-\x{7533}\x{7535}-\x{7551}' +. '\x{7553}-\x{7572}\x{7574}-\x{75E8}\x{75EA}-\x{7679}\x{767B}-\x{783E}\x{7840}-\x{7A62}\x{7A64}-\x{7AC2}' +. '\x{7AC4}-\x{7B06}\x{7B08}-\x{7B79}\x{7B7B}-\x{7BCE}\x{7BD0}-\x{7D99}\x{7D9B}-\x{7E49}\x{7E4C}-\x{8132}' +. '\x{8134}\x{8136}-\x{81D2}\x{81D4}-\x{8216}\x{8218}-\x{822D}\x{822F}-\x{83B4}\x{83B6}-\x{841F}' +. '\x{8421}-\x{86CC}\x{86CE}-\x{874A}\x{874C}-\x{877E}\x{8780}-\x{8A32}\x{8A34}-\x{8B71}\x{8B73}-\x{8B8E}' +. '\x{8B90}-\x{8DE4}\x{8DE6}-\x{8E9A}\x{8E9C}-\x{8EE1}\x{8EE4}-\x{8F0B}\x{8F0D}-\x{8FB9}\x{8FBB}-\x{9038}' +. '\x{903A}-\x{9196}\x{9198}-\x{91A3}\x{91A5}-\x{91B7}\x{91B9}-\x{91C7}\x{91C9}-\x{91E0}\x{91E2}-\x{91FB}' +. '\x{91FD}-\x{922B}\x{922D}-\x{9270}\x{9272}-\x{9420}\x{9422}-\x{9664}\x{9666}-\x{9679}\x{967B}-\x{9770}' +. '\x{9772}-\x{982B}\x{982D}-\x{98ED}\x{98EF}-\x{99C4}\x{99C6}-\x{9A11}\x{9A14}-\x{9A27}\x{9A29}-\x{9D0D}' +. '\x{9D0F}-\x{9D2B}\x{9D2D}-\x{9D8E}\x{9D90}-\x{9DC5}\x{9DC7}-\x{9E77}\x{9E79}-\x{9EB8}\x{9EBB}-\x{9F20}' +. '\x{9F22}-\x{9F61}\x{9F63}-\x{9FA5}\x{FA28}]{1,20}$/iu', + 6 => '/^[\x{002d}0-9A-Za-z]{1,63}$/iu', + 7 => '/^[\x{00A1}-\x{00FF}]{1,63}$/iu', + 8 => '/^[\x{0100}-\x{017f}]{1,63}$/iu', + 9 => '/^[\x{0180}-\x{024f}]{1,63}$/iu', + 10 => '/^[\x{0250}-\x{02af}]{1,63}$/iu', + 11 => '/^[\x{02b0}-\x{02ff}]{1,63}$/iu', + 12 => '/^[\x{0300}-\x{036f}]{1,63}$/iu', + 13 => '/^[\x{0370}-\x{03ff}]{1,63}$/iu', + 14 => '/^[\x{0400}-\x{04ff}]{1,63}$/iu', + 15 => '/^[\x{0500}-\x{052f}]{1,63}$/iu', + 16 => '/^[\x{0530}-\x{058F}]{1,63}$/iu', + 17 => '/^[\x{0590}-\x{05FF}]{1,63}$/iu', + 18 => '/^[\x{0600}-\x{06FF}]{1,63}$/iu', + 19 => '/^[\x{0700}-\x{074F}]{1,63}$/iu', + 20 => '/^[\x{0780}-\x{07BF}]{1,63}$/iu', + 21 => '/^[\x{0900}-\x{097F}]{1,63}$/iu', + 22 => '/^[\x{0980}-\x{09FF}]{1,63}$/iu', + 23 => '/^[\x{0A00}-\x{0A7F}]{1,63}$/iu', + 24 => '/^[\x{0A80}-\x{0AFF}]{1,63}$/iu', + 25 => '/^[\x{0B00}-\x{0B7F}]{1,63}$/iu', + 26 => '/^[\x{0B80}-\x{0BFF}]{1,63}$/iu', + 27 => '/^[\x{0C00}-\x{0C7F}]{1,63}$/iu', + 28 => '/^[\x{0C80}-\x{0CFF}]{1,63}$/iu', + 29 => '/^[\x{0D00}-\x{0D7F}]{1,63}$/iu', + 30 => '/^[\x{0D80}-\x{0DFF}]{1,63}$/iu', + 31 => '/^[\x{0E00}-\x{0E7F}]{1,63}$/iu', + 32 => '/^[\x{0E80}-\x{0EFF}]{1,63}$/iu', + 33 => '/^[\x{0F00}-\x{0FFF}]{1,63}$/iu', + 34 => '/^[\x{1000}-\x{109F}]{1,63}$/iu', + 35 => '/^[\x{10A0}-\x{10FF}]{1,63}$/iu', + 36 => '/^[\x{1100}-\x{11FF}]{1,63}$/iu', + 37 => '/^[\x{1200}-\x{137F}]{1,63}$/iu', + 38 => '/^[\x{13A0}-\x{13FF}]{1,63}$/iu', + 39 => '/^[\x{1400}-\x{167F}]{1,63}$/iu', + 40 => '/^[\x{1680}-\x{169F}]{1,63}$/iu', + 41 => '/^[\x{16A0}-\x{16FF}]{1,63}$/iu', + 42 => '/^[\x{1700}-\x{171F}]{1,63}$/iu', + 43 => '/^[\x{1720}-\x{173F}]{1,63}$/iu', + 44 => '/^[\x{1740}-\x{175F}]{1,63}$/iu', + 45 => '/^[\x{1760}-\x{177F}]{1,63}$/iu', + 46 => '/^[\x{1780}-\x{17FF}]{1,63}$/iu', + 47 => '/^[\x{1800}-\x{18AF}]{1,63}$/iu', + 48 => '/^[\x{1E00}-\x{1EFF}]{1,63}$/iu', + 49 => '/^[\x{1F00}-\x{1FFF}]{1,63}$/iu', + 50 => '/^[\x{2070}-\x{209F}]{1,63}$/iu', + 51 => '/^[\x{2100}-\x{214F}]{1,63}$/iu', + 52 => '/^[\x{2150}-\x{218F}]{1,63}$/iu', + 53 => '/^[\x{2460}-\x{24FF}]{1,63}$/iu', + 54 => '/^[\x{2E80}-\x{2EFF}]{1,63}$/iu', + 55 => '/^[\x{2F00}-\x{2FDF}]{1,63}$/iu', + 56 => '/^[\x{2FF0}-\x{2FFF}]{1,63}$/iu', + 57 => '/^[\x{3040}-\x{309F}]{1,63}$/iu', + 58 => '/^[\x{30A0}-\x{30FF}]{1,63}$/iu', + 59 => '/^[\x{3100}-\x{312F}]{1,63}$/iu', + 60 => '/^[\x{3130}-\x{318F}]{1,63}$/iu', + 61 => '/^[\x{3190}-\x{319F}]{1,63}$/iu', + 62 => '/^[\x{31A0}-\x{31BF}]{1,63}$/iu', + 63 => '/^[\x{31F0}-\x{31FF}]{1,63}$/iu', + 64 => '/^[\x{3200}-\x{32FF}]{1,63}$/iu', + 65 => '/^[\x{3300}-\x{33FF}]{1,63}$/iu', + 66 => '/^[\x{3400}-\x{4DBF}]{1,63}$/iu', + 67 => '/^[\x{4E00}-\x{9FFF}]{1,63}$/iu', + 68 => '/^[\x{A000}-\x{A48F}]{1,63}$/iu', + 69 => '/^[\x{A490}-\x{A4CF}]{1,63}$/iu', + 70 => '/^[\x{AC00}-\x{D7AF}]{1,63}$/iu', + 73 => '/^[\x{F900}-\x{FAFF}]{1,63}$/iu', + 74 => '/^[\x{FB00}-\x{FB4F}]{1,63}$/iu', + 75 => '/^[\x{FB50}-\x{FDFF}]{1,63}$/iu', + 76 => '/^[\x{FE20}-\x{FE2F}]{1,63}$/iu', + 77 => '/^[\x{FE70}-\x{FEFF}]{1,63}$/iu', + 78 => '/^[\x{FF00}-\x{FFEF}]{1,63}$/iu', + 79 => '/^[\x{20000}-\x{2A6DF}]{1,63}$/iu', + 80 => '/^[\x{2F800}-\x{2FA1F}]{1,63}$/iu', +]; diff --git a/vendor/laminas/laminas-validator/src/Hostname/Jp.php b/vendor/laminas/laminas-validator/src/Hostname/Jp.php new file mode 100644 index 00000000..8520f6a1 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Hostname/Jp.php @@ -0,0 +1,719 @@ + '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}' + . '\x{30A1}-\x{30F6}\x{30FC}' + . '\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' + . '\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}' + . '\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}' + . '\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}' + . '\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}' + . '\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}' + . '\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}' + . '\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}' + . '\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}' + . '\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}' + . '\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}' + . '\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}' + . '\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}' + . '\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}' + . '\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}' + . '\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}' + . '\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}' + . '\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}' + . '\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}' + . '\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}' + . '\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}' + . '\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}' + . '\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}' + . '\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}' + . '\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}' + . '\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}' + . '\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}' + . '\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}' + . '\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}' + . '\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}' + . '\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}' + . '\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}' + . '\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}' + . '\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}' + . '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' + . '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}' + . '\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}' + . '\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}' + . '\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}' + . '\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}' + . '\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}' + . '\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}' + . '\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}' + . '\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}' + . '\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}' + . '\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}' + . '\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}' + . '\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}' + . '\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}' + . '\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}' + . '\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}' + . '\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}' + . '\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}' + . '\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}' + . '\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}' + . '\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}' + . '\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}' + . '\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}' + . '\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}' + . '\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}' + . '\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}' + . '\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}' + . '\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}' + . '\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}' + . '\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}' + . '\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}' + . '\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}' + . '\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}' + . '\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}' + . '\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}' + . '\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}' + . '\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}' + . '\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}' + . '\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}' + . '\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}' + . '\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}' + . '\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}' + . '\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}' + . '\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}' + . '\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}' + . '\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}' + . '\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}' + . '\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}' + . '\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}' + . '\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}' + . '\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}' + . '\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}' + . '\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}' + . '\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}' + . '\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}' + . '\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}' + . '\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}' + . '\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}' + . '\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}' + . '\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}' + . '\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}' + . '\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}' + . '\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}' + . '\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}' + . '\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}' + . '\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}' + . '\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}' + . '\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}' + . '\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}' + . '\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}' + . '\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}' + . '\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}' + . '\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}' + . '\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}' + . '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}' + . '\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}' + . '\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}' + . '\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}' + . '\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}' + . '\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}' + . '\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}' + . '\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}' + . '\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}' + . '\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}' + . '\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}' + . '\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}' + . '\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}' + . '\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}' + . '\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}' + . '\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}' + . '\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}' + . '\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}' + . '\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}' + . '\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}' + . '\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}' + . '\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}' + . '\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}' + . '\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}' + . '\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}' + . '\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}' + . '\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}' + . '\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}' + . '\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}' + . '\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}' + . '\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}' + . '\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}' + . '\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}' + . '\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}' + . '\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}' + . '\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}' + . '\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}' + . '\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}' + . '\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}' + . '\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}' + . '\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}' + . '\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}' + . '\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}' + . '\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}' + . '\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}' + . '\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}' + . '\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}' + . '\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}' + . '\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}' + . '\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}' + . '\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}' + . '\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}' + . '\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}' + . '\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}' + . '\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}' + . '\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}' + . '\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}' + . '\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}' + . '\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}' + . '\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}' + . '\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}' + . '\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}' + . '\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}' + . '\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}' + . '\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}' + . '\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}' + . '\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}' + . '\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}' + . '\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}' + . '\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}' + . '\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}' + . '\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}' + . '\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}' + . '\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}' + . '\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}' + . '\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}' + . '\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}' + . '\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}' + . '\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}' + . '\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}' + . '\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}' + . '\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}' + . '\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}' + . '\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}' + . '\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}' + . '\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}' + . '\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}' + . '\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' + . '\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}' + . '\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}' + . '\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}' + . '\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}' + . '\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}' + . '\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}' + . '\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}' + . '\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}' + . '\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}' + . '\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}' + . '\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}' + . '\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}' + . '\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}' + . '\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}' + . '\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}' + . '\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}' + . '\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}' + . '\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}' + . '\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}' + . '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}' + . '\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}' + . '\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}' + . '\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}' + . '\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}' + . '\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}' + . '\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}' + . '\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}' + . '\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}' + . '\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}' + . '\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}' + . '\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}' + . '\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}' + . '\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}' + . '\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}' + . '\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}' + . '\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}' + . '\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}' + . '\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}' + . '\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}' + . '\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}' + . '\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}' + . '\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}' + . '\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}' + . '\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}' + . '\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}' + . '\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}' + . '\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}' + . '\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}' + . '\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}' + . '\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}' + . '\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}' + . '\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}' + . '\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}' + . '\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}' + . '\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}' + . '\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' + . '\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}' + . '\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}' + . '\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}' + . '\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}' + . '\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}' + . '\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}' + . '\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}' + . '\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}' + . '\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}' + . '\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}' + . '\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}' + . '\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}' + . '\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}' + . '\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}' + . '\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}' + . '\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}' + . '\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}' + . '\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}' + . '\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}' + . '\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}' + . '\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}' + . '\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}' + . '\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}' + . '\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}' + . '\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}' + . '\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}' + . '\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}' + . '\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}' + . '\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}' + . '\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}' + . '\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}' + . '\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}' + . '\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}' + . '\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}' + . '\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}' + . '\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}' + . '\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}' + . '\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}' + . '\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}' + . '\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}' + . '\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}' + . '\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}' + . '\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}' + . '\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}' + . '\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}' + . '\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}' + . '\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}' + . '\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}' + . '\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}' + . '\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}' + . '\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}' + . '\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}' + . '\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}' + . '\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}' + . '\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}' + . '\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}' + . '\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}' + . '\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}' + . '\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}' + . '\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}' + . '\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}' + . '\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}' + . '\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}' + . '\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}' + . '\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}' + . '\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}' + . '\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}' + . '\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}' + . '\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}' + . '\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}' + . '\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}' + . '\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}' + . '\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}' + . '\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}' + . '\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}' + . '\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}' + . '\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}' + . '\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}' + . '\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}' + . '\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}' + . '\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}' + . '\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}' + . '\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}' + . '\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}' + . '\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}' + . '\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}' + . '\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}' + . '\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}' + . '\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}' + . '\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}' + . '\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}' + . '\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}' + . '\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}' + . '\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}' + . '\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}' + . '\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}' + . '\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}' + . '\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}' + . '\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}' + . '\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}' + . '\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}' + . '\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}' + . '\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}' + . '\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}' + . '\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}' + . '\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}' + . '\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}' + . '\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}' + . '\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}' + . '\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}' + . '\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}' + . '\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}' + . '\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}' + . '\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}' + . '\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}' + . '\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}' + . '\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}' + . '\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}' + . '\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}' + . '\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}' + . '\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}' + . '\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}' + . '\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}' + . '\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}' + . '\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}' + . '\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}' + . '\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}' + . '\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}' + . '\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}' + . '\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}' + . '\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}' + . '\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}' + . '\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}' + . '\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}' + . '\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}' + . '\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}' + . '\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}' + . '\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}' + . '\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}' + . '\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}' + . '\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}' + . '\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}' + . '\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}' + . '\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}' + . '\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}' + . '\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}' + . '\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}' + . '\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}' + . '\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}' + . '\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}' + . '\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}' + . '\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}' + . '\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}' + . '\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}' + . '\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}' + . '\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}' + . '\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}' + . '\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' + . '\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}' + . '\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}' + . '\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}' + . '\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}' + . '\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}' + . '\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}' + . '\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}' + . '\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}' + . '\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}' + . '\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}' + . '\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}' + . '\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}' + . '\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}' + . '\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}' + . '\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}' + . '\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}' + . '\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}' + . '\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}' + . '\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}' + . '\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}' + . '\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}' + . '\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}' + . '\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}' + . '\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}' + . '\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}' + . '\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}' + . '\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}' + . '\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}' + . '\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}' + . '\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}' + . '\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}' + . '\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}' + . '\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}' + . '\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}' + . '\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}' + . '\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}' + . '\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}' + . '\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}' + . '\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}' + . '\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}' + . '\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}' + . '\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}' + . '\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}' + . '\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}' + . '\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}' + . '\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}' + . '\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}' + . '\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}' + . '\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}' + . '\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}' + . '\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}' + . '\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}' + . '\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}' + . '\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}' + . '\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}' + . '\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}' + . '\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}' + . '\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}' + . '\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}' + . '\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}' + . '\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}' + . '\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}' + . '\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}' + . '\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}' + . '\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}' + . '\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}' + . '\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}' + . '\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}' + . '\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}' + . '\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}' + . '\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}' + . '\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}' + . '\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}' + . '\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}' + . '\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}' + . '\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}' + . '\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}' + . '\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}' + . '\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}' + . '\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}' + . '\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}' + . '\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}' + . '\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}' + . '\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}' + . '\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}' + . '\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}' + . '\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}' + . '\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}' + . '\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}' + . '\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}' + . '\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}' + . '\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}' + . '\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}' + . '\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}' + . '\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}' + . '\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}' + . '\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}' + . '\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}' + . '\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}' + . '\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}' + . '\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}' + . '\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}' + . '\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}' + . '\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}' + . '\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}' + . '\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}' + . '\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}' + . '\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}' + . '\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}' + . '\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}' + . '\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}' + . '\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}' + . '\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}' + . '\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}' + . '\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}' + . '\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}' + . '\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}' + . '\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}' + . '\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}' + . '\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}' + . '\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}' + . '\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}' + . '\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}' + . '\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}' + . '\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}' + . '\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}' + . '\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}' + . '\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}' + . '\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}' + . '\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}' + . '\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}' + . '\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}' + . '\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}' + . '\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}' + . '\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}' + . '\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}' + . '\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}' + . '\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}' + . '\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}' + . '\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}' + . '\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}' + . '\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}' + . '\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}' + . '\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}' + . '\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}' + . '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}' + . '\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}' + . '\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}' + . '\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}' + . '\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}' + . '\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}' + . '\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}' + . '\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}' + . '\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}' + . '\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}' + . '\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}' + . '\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}' + . '\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}' + . '\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}' + . '\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}' + . '\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}' + . '\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}' + . '\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}' + . '\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}' + . '\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}' + . '\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}' + . '\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}' + . '\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}' + . '\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}' + . '\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}' + . '\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}' + . '\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}' + . '\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}' + . '\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}' + . '\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}' + . '\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}' + . '\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}' + . '\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}' + . '\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}' + . '\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}' + . '\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}' + . '\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}' + . '\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}' + . '\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}' + . '\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}' + . '\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}' + . '\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}' + . '\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}' + . '\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}' + . '\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}' + . '\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}' + . '\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}' + . '\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}' + . '\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}' + . '\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}' + . '\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}' + . '\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}' + . '\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}' + . '\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}' + . '\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}' + . '\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}' + . '\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}' + . '\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}' + . '\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}' + . '\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}' + . '\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}' + . '\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}' + . '\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}' + . '\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}' + . '\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}' + . '\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}' + . '\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}' + . '\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}' + . '\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}' + . '\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}' + . '\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}' + . '\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}' + . '\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}' + . '\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}' + . '\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}' + . '\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}' + . '\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}' + . '\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}' + . '\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}' + . '\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}' + . '\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}' + . '\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}' + . '\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}' + . '\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}' + . '\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}' + . '\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}' + . '\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}' + . '\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}' + . '\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}' + . '\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}' + . '\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}' + . '\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}' + . '\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}' + . '\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}' + . '\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}' + . '\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}' + . '\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}' + . '\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}' + . '\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}' + . '\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}' + . '\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}' + . '\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}' + . '\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}' + . '\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}' + . '\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}' + . '\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}' + . '\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}' + . '\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}' + . '\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}' + . '\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}' + . '\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}' + . '\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}' + . '\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}' + . '\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}' + . '\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}' + . '\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}' + . '\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}' + . '\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}' + . '\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}' + . '\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}' + . '\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}' + . '\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}' + . '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}' + . '\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}' + . '\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}' + . '\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}' + . '\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}' + . '\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}' + . '\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}' + . '\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}' + . '\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}' + . '\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}' + . '\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}' + . '\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' + . '\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}' + . '\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}' + . '\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}' + . '\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}' + . '\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}' + . '\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}' + . '\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}' + . '\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}' + . '\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}' + . '\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}' + . '\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}' + . '\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}' + . '\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}' + . '\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}' + . '\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}' + . '\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}' + . '\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu', +]; diff --git a/vendor/laminas/laminas-validator/src/Iban.php b/vendor/laminas/laminas-validator/src/Iban.php new file mode 100644 index 00000000..dfe869a4 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Iban.php @@ -0,0 +1,374 @@ + + */ + protected $messageTemplates = [ + self::NOTSUPPORTED => 'Unknown country within the IBAN', + self::SEPANOTSUPPORTED => 'Countries outside the Single Euro Payments Area (SEPA) are not supported', + self::FALSEFORMAT => 'The input has a false IBAN format', + self::CHECKFAILED => 'The input has failed the IBAN check', + ]; + + /** + * Optional country code by ISO 3166-1 + * + * @var string|null + */ + protected $countryCode; + + /** + * Optionally allow IBAN codes from non-SEPA countries. Defaults to true + * + * @var bool + */ + protected $allowNonSepa = true; + + /** + * The SEPA country codes + * + * @var string[] ISO 3166-1 codes + */ + protected static $sepaCountries = [ + 'AT', + 'BE', + 'BG', + 'CY', + 'CZ', + 'DK', + 'FO', + 'GL', + 'EE', + 'FI', + 'FR', + 'DE', + 'GI', + 'GR', + 'HU', + 'IS', + 'IE', + 'IT', + 'LV', + 'LI', + 'LT', + 'LU', + 'MT', + 'MC', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'SK', + 'SI', + 'ES', + 'SE', + 'CH', + 'GB', + 'SM', + 'HR', + ]; + + /** + * IBAN regexes by country code + * + * @var array + */ + protected static $ibanRegex = [ + 'AD' => 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}', + 'AE' => 'AE[0-9]{2}[0-9]{3}[0-9]{16}', + 'AL' => 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}', + 'AT' => 'AT[0-9]{2}[0-9]{5}[0-9]{11}', + 'AZ' => 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}', + 'BA' => 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}', + 'BE' => 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}', + 'BG' => 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}', + 'BH' => 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}', + 'BR' => 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]', + 'BY' => 'BY[0-9]{2}[A-Z0-9]{4}[0-9]{4}[A-Z0-9]{16}', + 'CH' => 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}', + 'CR' => 'CR[0-9]{2}[0-9]{3}[0-9]{14}', + 'CY' => 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}', + 'CZ' => 'CZ[0-9]{2}[0-9]{20}', + 'DE' => 'DE[0-9]{2}[0-9]{8}[0-9]{10}', + 'DO' => 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}', + 'DK' => 'DK[0-9]{2}[0-9]{14}', + 'EE' => 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}', + 'ES' => 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}', + 'FI' => 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}', + 'FO' => 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', + 'FR' => 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', + 'GB' => 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', + 'GE' => 'GE[0-9]{2}[A-Z]{2}[0-9]{16}', + 'GI' => 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}', + 'GL' => 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', + 'GR' => 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}', + 'GT' => 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}', + 'HR' => 'HR[0-9]{2}[0-9]{7}[0-9]{10}', + 'HU' => 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}', + 'IE' => 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', + 'IL' => 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}', + 'IS' => 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}', + 'IT' => 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', + 'KW' => 'KW[0-9]{2}[A-Z]{4}[0-9]{22}', + 'KZ' => 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}', + 'LB' => 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}', + 'LI' => 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}', + 'LT' => 'LT[0-9]{2}[0-9]{5}[0-9]{11}', + 'LU' => 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}', + 'LV' => 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}', + 'MC' => 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', + 'MD' => 'MD[0-9]{2}[A-Z0-9]{20}', + 'ME' => 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', + 'MK' => 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}', + 'MR' => 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}', + 'MT' => 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}', + 'MU' => 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}', + 'NL' => 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', + 'NO' => 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}', + 'UA' => 'UA[0-9]{2}[0-9]{6}[0-9]{19}', + 'PK' => 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', + 'PL' => 'PL[0-9]{2}[0-9]{8}[0-9]{16}', + 'PS' => 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', + 'PT' => 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}', + 'RO' => 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', + 'RS' => 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', + 'SA' => 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}', + 'SE' => 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}', + 'SI' => 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}', + 'SK' => 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}', + 'SM' => 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', + 'TN' => 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', + 'TR' => 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}', + 'VG' => 'VG[0-9]{2}[A-Z]{4}[0-9]{16}', + ]; + + /** + * Sets validator options + * + * @param array|Traversable $options OPTIONAL + */ + public function __construct($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (array_key_exists('country_code', $options)) { + $this->setCountryCode($options['country_code']); + } + + if (array_key_exists('allow_non_sepa', $options)) { + $this->setAllowNonSepa($options['allow_non_sepa']); + } + + parent::__construct($options); + } + + /** + * Returns the optional country code by ISO 3166-1 + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return string|null + */ + public function getCountryCode() + { + return $this->countryCode; + } + + /** + * Sets an optional country code by ISO 3166-1 + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param string|null $countryCode + * @return $this provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setCountryCode($countryCode = null) + { + if ($countryCode !== null) { + $countryCode = (string) $countryCode; + + if (! isset(static::$ibanRegex[$countryCode])) { + throw new Exception\InvalidArgumentException( + "Country code '{$countryCode}' invalid by ISO 3166-1 or not supported" + ); + } + } + + $this->countryCode = $countryCode; + return $this; + } + + /** + * Returns the optional allow non-sepa countries setting + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return bool + */ + public function allowNonSepa() + { + return $this->allowNonSepa; + } + + /** + * Sets the optional allow non-sepa countries setting + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param bool $allowNonSepa + * @return $this provides a fluent interface + */ + public function setAllowNonSepa($allowNonSepa) + { + $this->allowNonSepa = (bool) $allowNonSepa; + return $this; + } + + /** + * Returns true if $value is a valid IBAN + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::FALSEFORMAT); + return false; + } + + $value = str_replace(' ', '', strtoupper($value)); + $this->setValue($value); + + $countryCode = $this->getCountryCode(); + if ($countryCode === null) { + $countryCode = substr($value, 0, 2); + } + + if (! array_key_exists($countryCode, static::$ibanRegex)) { + $this->setValue($countryCode); + $this->error(self::NOTSUPPORTED); + return false; + } + + if (! $this->allowNonSepa && ! in_array($countryCode, static::$sepaCountries)) { + $this->setValue($countryCode); + $this->error(self::SEPANOTSUPPORTED); + return false; + } + + if (! preg_match('/^' . static::$ibanRegex[$countryCode] . '$/', $value)) { + $this->error(self::FALSEFORMAT); + return false; + } + + $format = substr($value, 4) . substr($value, 0, 4); + $format = str_replace( + [ + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + ], + [ + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + '18', + '19', + '20', + '21', + '22', + '23', + '24', + '25', + '26', + '27', + '28', + '29', + '30', + '31', + '32', + '33', + '34', + '35', + ], + $format + ); + + $temp = intval(substr($format, 0, 1)); + $len = strlen($format); + for ($x = 1; $x < $len; ++$x) { + $temp *= 10; + $temp += intval(substr($format, $x, 1)); + $temp %= 97; + } + + if ($temp !== 1) { + $this->error(self::CHECKFAILED); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Identical.php b/vendor/laminas/laminas-validator/src/Identical.php new file mode 100644 index 00000000..62733f13 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Identical.php @@ -0,0 +1,231 @@ + 'The two given tokens do not match', + self::MISSING_TOKEN => 'No token was provided to match against', + ]; + + /** @var array */ + protected $messageVariables = [ + 'token' => 'tokenString', + ]; + + /** + * Original token against which to validate + * + * @var null|string + */ + protected $tokenString; + + /** @var null|string */ + protected $token; + + /** @var bool */ + protected $strict = true; + + /** @var bool */ + protected $literal = false; + + /** + * Sets validator options + * + * @param mixed $token + */ + public function __construct($token = null) + { + if ($token instanceof Traversable) { + $token = ArrayUtils::iteratorToArray($token); + } + + if (is_array($token) && array_key_exists('token', $token)) { + if (array_key_exists('strict', $token)) { + $this->setStrict($token['strict']); + } + + if (array_key_exists('literal', $token)) { + $this->setLiteral($token['literal']); + } + + $this->setToken($token['token']); + } elseif (null !== $token) { + $this->setToken($token); + } + + parent::__construct(is_array($token) ? $token : null); + } + + /** + * Retrieve token + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return mixed + */ + public function getToken() + { + return $this->token; + } + + /** + * Set token against which to compare + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return $this + */ + public function setToken(mixed $token) + { + $this->tokenString = is_array($token) ? var_export($token, true) : (string) $token; + $this->token = $token; + return $this; + } + + /** + * Returns the strict parameter + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return bool + */ + public function getStrict() + { + return $this->strict; + } + + /** + * Sets the strict parameter + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param bool $strict + * @return $this + */ + public function setStrict($strict) + { + $this->strict = (bool) $strict; + return $this; + } + + /** + * Returns the literal parameter + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return bool + */ + public function getLiteral() + { + return $this->literal; + } + + /** + * Sets the literal parameter + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param bool $literal + * @return $this + */ + public function setLiteral($literal) + { + $this->literal = (bool) $literal; + return $this; + } + + /** + * Returns true if and only if a token has been set and the provided value + * matches that token. + * + * @param mixed $value + * @param null|array|ArrayAccess $context + * @throws Exception\InvalidArgumentException If context is not array or ArrayObject. + * @return bool + */ + public function isValid($value, $context = null) + { + $this->setValue($value); + + $token = $this->getToken(); + + if (! $this->getLiteral() && $context !== null) { + if (! is_array($context) && ! $context instanceof ArrayAccess) { + throw new Exception\InvalidArgumentException(sprintf( + 'Context passed to %s must be array, ArrayObject or null; received "%s"', + __METHOD__, + get_debug_type($context) + )); + } + + if (is_array($token)) { + while (is_array($token)) { + $key = key($token); + if (! isset($context[$key])) { + break; + } + $context = $context[$key]; + $token = $token[$key]; + } + } + + // if $token is an array it means the above loop didn't went all the way down to the leaf, + // so the $token structure doesn't match the $context structure + if ( + is_array($token) + || (! is_int($token) && ! is_string($token)) + || ! isset($context[$token]) + ) { + $token = $this->getToken(); + } else { + $token = $context[$token]; + } + } + + if ($token === null) { + $this->error(self::MISSING_TOKEN); + return false; + } + + $strict = $this->getStrict(); + if ( + ($strict && ($value !== $token)) + // phpcs:ignore SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedNotEqualOperator + || (! $strict && ($value != $token)) + ) { + $this->error(self::NOT_SAME); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/InArray.php b/vendor/laminas/laminas-validator/src/InArray.php new file mode 100644 index 00000000..fd4a4925 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/InArray.php @@ -0,0 +1,266 @@ + */ + protected $messageTemplates = [ + self::NOT_IN_ARRAY => 'The input was not found in the haystack', + ]; + + /** + * Haystack of possible values + * + * @var array + */ + protected $haystack; + + /** + * Type of strict check to be used. Due to "foo" == 0 === TRUE with in_array when strict = false, + * an option has been added to prevent this. When $strict = 0/false, the most + * secure non-strict check is implemented. if $strict = -1, the default in_array non-strict + * behaviour is used + * + * @var int + */ + protected $strict = self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY; + + /** + * Whether a recursive search should be done + * + * @var bool + */ + protected $recursive = false; + + /** + * Returns the haystack option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return mixed + * @throws Exception\RuntimeException If haystack option is not set. + */ + public function getHaystack() + { + if ($this->haystack === null) { + throw new Exception\RuntimeException('haystack option is mandatory'); + } + return $this->haystack; + } + + /** + * Sets the haystack option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param mixed $haystack + * @return $this Provides a fluent interface + */ + public function setHaystack(array $haystack) + { + $this->haystack = $haystack; + return $this; + } + + /** + * Returns the strict option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return bool|int + */ + public function getStrict() + { + // To keep BC with new strict modes + if ( + $this->strict === self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY + || $this->strict === self::COMPARE_STRICT + ) { + return (bool) $this->strict; + } + return $this->strict; + } + + /** + * Sets the strict option mode + * InArray::COMPARE_STRICT + * InArray::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY + * InArray::COMPARE_NOT_STRICT + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param int|bool $strict + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setStrict($strict) + { + if (is_bool($strict)) { + $strict = $strict ? self::COMPARE_STRICT : self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY; + } + + $checkTypes = [ + self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY, // 0 + self::COMPARE_STRICT, // 1 + self::COMPARE_NOT_STRICT, // -1 + ]; + + // validate strict value + if (! in_array($strict, $checkTypes)) { + throw new Exception\InvalidArgumentException('Strict option must be one of the COMPARE_ constants'); + } + + $this->strict = $strict; + return $this; + } + + /** + * Returns the recursive option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @return bool + */ + public function getRecursive() + { + return $this->recursive; + } + + /** + * Sets the recursive option + * + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param bool $recursive + * @return $this Provides a fluent interface + */ + public function setRecursive($recursive) + { + $this->recursive = (bool) $recursive; + return $this; + } + + /** + * Returns true if and only if $value is contained in the haystack option. If the strict + * option is true, then the type of $value is also checked. + * + * @param mixed $value + * See {@link http://php.net/manual/function.in-array.php#104501} + * @return bool + */ + public function isValid($value) + { + // we create a copy of the haystack in case we need to modify it + $haystack = $this->getHaystack(); + + // if the input is a string or float, and vulnerability protection is on + // we type cast the input to a string + if ( + self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY === $this->strict + && (is_int($value) || is_float($value)) + ) { + $value = (string) $value; + } + + $this->setValue($value); + + if ($this->getRecursive()) { + $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack)); + foreach ($iterator as $element) { + if (self::COMPARE_STRICT === $this->strict) { + if ($element === $value) { + return true; + } + + continue; + } + + // add protection to prevent string to int vuln's + $el = $element; + if ( + self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY === $this->strict + && is_string($value) && (is_int($el) || is_float($el)) + ) { + $el = (string) $el; + } + + // phpcs:ignore SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedEqualOperator + if ($el == $value) { + return true; + } + } + + $this->error(self::NOT_IN_ARRAY); + return false; + } + + /** + * If the check is not strict, then, to prevent "asdf" being converted to 0 + * and returning a false positive if 0 is in haystack, we type cast + * the haystack to strings. To prevent "56asdf" == 56 === TRUE we also + * type cast values like 56 to strings as well. + * + * This occurs only if the input is a string and a haystack member is an int + */ + if ( + self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY === $this->strict + && is_string($value) + ) { + foreach ($haystack as &$h) { + if (is_int($h) || is_float($h)) { + $h = (string) $h; + } + } + + if (in_array($value, $haystack, (bool) $this->strict)) { + return true; + } + + $this->error(self::NOT_IN_ARRAY); + return false; + } + + if (in_array($value, $haystack, self::COMPARE_STRICT === $this->strict)) { + return true; + } + + if (self::COMPARE_NOT_STRICT === $this->strict) { + return true; + } + + $this->error(self::NOT_IN_ARRAY); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/Ip.php b/vendor/laminas/laminas-validator/src/Ip.php new file mode 100644 index 00000000..d1d1b696 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Ip.php @@ -0,0 +1,198 @@ + 'Invalid type given. String expected', + self::NOT_IP_ADDRESS => 'The input does not appear to be a valid IP address', + ]; + + /** + * Internal options + * + * @var array + */ + protected $options = [ + 'allowipv4' => true, // Enable IPv4 Validation + 'allowipv6' => true, // Enable IPv6 Validation + 'allowipvfuture' => false, // Enable IPvFuture Validation + 'allowliteral' => true, // Enable IPs in literal format (only IPv6 and IPvFuture) + ]; + + /** + * Sets the options for this validator + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException If there is any kind of IP allowed or $options is not an array + * or Traversable. + * @return AbstractValidator + */ + public function setOptions($options = []) + { + parent::setOptions($options); + + if (! $this->options['allowipv4'] && ! $this->options['allowipv6'] && ! $this->options['allowipvfuture']) { + throw new Exception\InvalidArgumentException('Nothing to validate. Check your options'); + } + + return $this; + } + + /** + * Returns true if and only if $value is a valid IP address + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + if ($this->options['allowipv4'] && $this->validateIPv4($value)) { + return true; + } else { + if ((bool) $this->options['allowliteral']) { + static $regex = '/^\[(.*)\]$/'; + if ((bool) preg_match($regex, $value, $matches)) { + $value = $matches[1]; + } + } + + $isValidV6Address = $this->validateIPv6($value); + $isValidV6Address = $isValidV6Address !== false && $isValidV6Address !== 0; + + if ( + ($this->options['allowipv6'] && $isValidV6Address) || + ($this->options['allowipvfuture'] && $this->validateIPvFuture($value)) + ) { + return true; + } + } + $this->error(self::NOT_IP_ADDRESS); + return false; + } + + /** + * Validates an IPv4 address + * + * @param string $value + * @return bool + */ + protected function validateIPv4($value) + { + if (preg_match('/^([01]{8}\.){3}[01]{8}\z/i', $value)) { + // binary format 00000000.00000000.00000000.00000000 + $value = bindec(substr($value, 0, 8)) . '.' . bindec(substr($value, 9, 8)) . '.' + . bindec(substr($value, 18, 8)) . '.' . bindec(substr($value, 27, 8)); + } elseif (preg_match('/^([0-9]{3}\.){3}[0-9]{3}\z/i', $value)) { + // octet format 777.777.777.777 + $value = (int) substr($value, 0, 3) . '.' . (int) substr($value, 4, 3) . '.' + . (int) substr($value, 8, 3) . '.' . (int) substr($value, 12, 3); + } elseif (preg_match('/^([0-9a-f]{2}\.){3}[0-9a-f]{2}\z/i', $value)) { + // hex format ff.ff.ff.ff + $value = hexdec(substr($value, 0, 2)) . '.' . hexdec(substr($value, 3, 2)) . '.' + . hexdec(substr($value, 6, 2)) . '.' . hexdec(substr($value, 9, 2)); + } + + $ip2long = ip2long($value); + if ($ip2long === false) { + return false; + } + + return $value === long2ip($ip2long); + } + + /** + * Validates an IPv6 address + * + * @param string $value Value to check against + * @return bool|int True when $value is a valid ipv6 address False otherwise + */ + protected function validateIPv6($value) + { + if (strlen($value) < 3) { + return $value === '::'; + } + + if (strpos($value, '.') !== false) { + $lastcolon = strrpos($value, ':'); + if (! ($lastcolon !== false && $this->validateIPv4(substr($value, $lastcolon + 1)))) { + return false; + } + + $value = substr($value, 0, $lastcolon) . ':0:0'; + } + + if (! str_contains($value, '::')) { + return preg_match('/\A(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}\z/i', $value); + } + + $colonCount = substr_count($value, ':'); + if ($colonCount < 8) { + return preg_match('/\A(?::|(?:[a-f0-9]{1,4}:)+):(?:(?:[a-f0-9]{1,4}:)*[a-f0-9]{1,4})?\z/i', $value); + } + + // special case with ending or starting double colon + if ($colonCount === 8) { + return preg_match('/\A(?:::)?(?:[a-f0-9]{1,4}:){6}[a-f0-9]{1,4}(?:::)?\z/i', $value); + } + + return false; + } + + /** + * Validates an IPvFuture address. + * + * IPvFuture is loosely defined in the Section 3.2.2 of RFC 3986 + * + * @param string $value Value to check against + * @return bool True when $value is a valid IPvFuture address + * False otherwise + */ + protected function validateIPvFuture($value) + { + /* + * ABNF: + * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," + * / ";" / "=" + */ + static $regex = '/^v([[:xdigit:]]+)\.[[:alnum:]\-\._~!\$&\'\(\)\*\+,;=:]+$/'; + + $result = (bool) preg_match($regex, $value, $matches); + + /* + * "As such, implementations must not provide the version flag for the + * existing IPv4 and IPv6 literal address forms described below." + */ + return $result && $matches[1] !== '4' && $matches[1] !== '6'; + } +} diff --git a/vendor/laminas/laminas-validator/src/IsArray.php b/vendor/laminas/laminas-validator/src/IsArray.php new file mode 100644 index 00000000..cba75f2f --- /dev/null +++ b/vendor/laminas/laminas-validator/src/IsArray.php @@ -0,0 +1,40 @@ + */ + protected $messageTemplates = [ + self::NOT_ARRAY => 'Expected an array value but %type% provided', + ]; + + /** @var array */ + protected $messageVariables = [ + 'type' => 'type', + ]; + + protected ?string $type = null; + + /** @var array */ + protected $options = []; + + public function isValid(mixed $value): bool + { + if (is_array($value)) { + return true; + } + + $this->type = get_debug_type($value); + $this->error(self::NOT_ARRAY); + + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/IsCountable.php b/vendor/laminas/laminas-validator/src/IsCountable.php new file mode 100644 index 00000000..72dac0b9 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/IsCountable.php @@ -0,0 +1,223 @@ + + * @property Options&array $options Required to stop Psalm getting confused about the declaration + * on AbstractValidator + * @final + */ +class IsCountable extends AbstractValidator +{ + public const NOT_COUNTABLE = 'notCountable'; + public const NOT_EQUALS = 'notEquals'; + public const GREATER_THAN = 'greaterThan'; + public const LESS_THAN = 'lessThan'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = [ + self::NOT_COUNTABLE => 'The input must be an array or an instance of \\Countable', + self::NOT_EQUALS => "The input count must equal '%count%'", + self::GREATER_THAN => "The input count must be less than '%max%', inclusively", + self::LESS_THAN => "The input count must be greater than '%min%', inclusively", + ]; + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = [ + 'count' => ['options' => 'count'], + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + ]; + + /** @psalm-var Options */ + protected $options = [ + 'count' => null, + 'min' => null, + 'max' => null, + ]; + + /** + * @param OptionsArgument|iterable $options + * @return $this Provides fluid interface + */ + public function setOptions($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + /** @psalm-var Options $options */ + + if (isset($options['count'])) { + $this->setCount($options['count']); + } + + if (isset($options['min'])) { + $this->setMin($options['min']); + } + + if (isset($options['max'])) { + $this->setMax($options['max']); + } + + unset($options['count'], $options['min'], $options['max']); + + parent::setOptions($options); + + return $this; + } + + /** + * Returns true if and only if $value is countable (and the count validates against optional values). + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_countable($value)) { + $this->error(self::NOT_COUNTABLE); + return false; + } + + $count = count($value); + + if (is_numeric($this->getCount())) { + if ($count !== $this->getCount()) { + $this->error(self::NOT_EQUALS); + return false; + } + + return true; + } + + if (is_numeric($this->getMax()) && $count > $this->getMax()) { + $this->error(self::GREATER_THAN); + return false; + } + + if (is_numeric($this->getMin()) && $count < $this->getMin()) { + $this->error(self::LESS_THAN); + return false; + } + + return true; + } + + /** + * Returns the count option + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in 3.0 + * + * @return int|null + */ + public function getCount() + { + return $this->options['count']; + } + + /** + * Returns the min option + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in 3.0 + * + * @return int|null + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Returns the max option + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in 3.0 + * + * @return int|null + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * @throws Exception\InvalidArgumentException If either a min or max option + * was previously set. + */ + private function setCount(int $value): void + { + if (isset($this->options['min']) || isset($this->options['max'])) { + throw new Exception\InvalidArgumentException( + 'Cannot set count; conflicts with either a min or max option previously set' + ); + } + $this->options['count'] = $value; + } + + /** + * @throws Exception\InvalidArgumentException If either a count or max option + * was previously set. + */ + private function setMin(int $value): void + { + if (isset($this->options['count'])) { + throw new Exception\InvalidArgumentException( + 'Cannot set count; conflicts with either a count option previously set' + ); + } + $this->options['min'] = $value; + } + + /** + * @throws Exception\InvalidArgumentException If either a count or min option + * was previously set. + */ + private function setMax(int $value): void + { + if (isset($this->options['count'])) { + throw new Exception\InvalidArgumentException( + 'Cannot set count; conflicts with either a count option previously set' + ); + } + $this->options['max'] = $value; + } +} diff --git a/vendor/laminas/laminas-validator/src/IsInstanceOf.php b/vendor/laminas/laminas-validator/src/IsInstanceOf.php new file mode 100644 index 00000000..9fe273d0 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/IsInstanceOf.php @@ -0,0 +1,108 @@ + "The input is not an instance of '%className%'", + ]; + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = [ + 'className' => 'className', + ]; + + /** @var string */ + protected $className; + + /** + * Sets validator options + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } + + // If argument is not an array, consider first argument as class name + if (! is_array($options)) { + $options = func_get_args(); + + $tmpOptions = []; + $tmpOptions['className'] = array_shift($options); + + $options = $tmpOptions; + } + + if (! array_key_exists('className', $options)) { + throw new Exception\InvalidArgumentException('Missing option "className"'); + } + + parent::__construct($options); + } + + /** + * Get class name + * + * @deprecated Since 2.61.0 All option setters and getters will be removed in v3.0 + * + * @return string + */ + public function getClassName() + { + return $this->className; + } + + /** + * Set class name + * + * @deprecated Since 2.61.0 All option setters and getters will be removed in v3.0 + * + * @param string $className + * @return $this + */ + public function setClassName($className) + { + $this->className = $className; + return $this; + } + + /** + * Returns true if $value is instance of $this->className + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if ($value instanceof $this->className) { + return true; + } + $this->error(self::NOT_INSTANCE_OF); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/IsJsonString.php b/vendor/laminas/laminas-validator/src/IsJsonString.php new file mode 100644 index 00000000..f415ca99 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/IsJsonString.php @@ -0,0 +1,160 @@ +, + * maxDepth: positive-int, + * } + * @psalm-import-type AbstractOptions from AbstractValidator + * @psalm-type Options = AbstractOptions|CustomOptions + */ +final class IsJsonString extends AbstractValidator +{ + public const ERROR_NOT_STRING = 'errorNotString'; + public const ERROR_TYPE_NOT_ALLOWED = 'errorTypeNotAllowed'; + public const ERROR_MAX_DEPTH_EXCEEDED = 'errorMaxDepthExceeded'; + public const ERROR_INVALID_JSON = 'errorInvalidJson'; + + public const ALLOW_INT = 0b0000001; + public const ALLOW_FLOAT = 0b0000010; + public const ALLOW_BOOL = 0b0000100; + public const ALLOW_ARRAY = 0b0001000; + public const ALLOW_OBJECT = 0b0010000; + public const ALLOW_ALL = 0b0011111; + + /** @var array */ + protected $messageTemplates = [ + self::ERROR_NOT_STRING => 'Expected a string but %type% was received', + self::ERROR_TYPE_NOT_ALLOWED => 'Received a JSON %type% but this type is not acceptable', + self::ERROR_MAX_DEPTH_EXCEEDED => 'The decoded JSON payload exceeds the allowed depth of %maxDepth%', + self::ERROR_INVALID_JSON => 'An invalid JSON payload was received', + ]; + + /** @var array */ + protected $messageVariables = [ + 'type' => 'type', + 'maxDepth' => 'maxDepth', + ]; + + protected ?string $type = null; + /** @var int-mask-of */ + protected int $allow = self::ALLOW_ALL; + /** @var positive-int */ + protected int $maxDepth = 512; + + /** + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param int-mask-of $type + */ + public function setAllow(int $type): void + { + $this->allow = $type; + } + + /** + * @deprecated Since 2.61.0 - All option setters and getters will be removed in 3.0 + * + * @param positive-int $maxDepth + */ + public function setMaxDepth(int $maxDepth): void + { + $this->maxDepth = $maxDepth; + } + + public function isValid(mixed $value): bool + { + if (! is_string($value)) { + $this->error(self::ERROR_NOT_STRING); + $this->type = gettype($value); + + return false; + } + + if (is_numeric($value)) { + /** @psalm-var mixed $value */ + $value = json_decode($value); + + if (is_int($value) && ! $this->isAllowed(self::ALLOW_INT)) { + $this->error(self::ERROR_TYPE_NOT_ALLOWED); + $this->type = 'int'; + + return false; + } + + if (is_float($value) && ! $this->isAllowed(self::ALLOW_FLOAT)) { + $this->error(self::ERROR_TYPE_NOT_ALLOWED); + $this->type = 'float'; + + return false; + } + + return true; + } + + if ($value === 'true' || $value === 'false') { + if (! $this->isAllowed(self::ALLOW_BOOL)) { + $this->error(self::ERROR_TYPE_NOT_ALLOWED); + $this->type = 'boolean'; + + return false; + } + + return true; + } + + if (str_starts_with($value, '[') && ! $this->isAllowed(self::ALLOW_ARRAY)) { + $this->error(self::ERROR_TYPE_NOT_ALLOWED); + $this->type = 'array'; + + return false; + } + + if (str_starts_with($value, '{') && ! $this->isAllowed(self::ALLOW_OBJECT)) { + $this->error(self::ERROR_TYPE_NOT_ALLOWED); + $this->type = 'object'; + + return false; + } + + try { + /** @psalm-suppress UnusedFunctionCall */ + json_decode($value, true, $this->maxDepth, JSON_THROW_ON_ERROR); + + return true; + } catch (JsonException $e) { + if ($e->getCode() === JSON_ERROR_DEPTH) { + $this->error(self::ERROR_MAX_DEPTH_EXCEEDED); + + return false; + } + + $this->error(self::ERROR_INVALID_JSON); + + return false; + } + } + + /** @param self::ALLOW_* $flag */ + private function isAllowed(int $flag): bool + { + return ($this->allow & $flag) === $flag; + } +} diff --git a/vendor/laminas/laminas-validator/src/Isbn.php b/vendor/laminas/laminas-validator/src/Isbn.php new file mode 100644 index 00000000..09abc603 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Isbn.php @@ -0,0 +1,199 @@ + 'Invalid type given. String or integer expected', + self::NO_ISBN => 'The input is not a valid ISBN number', + ]; + + /** @var array */ + protected $options = [ + 'type' => self::AUTO, // Allowed type + 'separator' => '', // Separator character + ]; + + /** + * Detect input format. + * + * @return null|string + */ + protected function detectFormat() + { + // prepare separator and pattern list + $sep = quotemeta($this->getSeparator()); + $patterns = []; + $lengths = []; + $type = $this->getType(); + + // check for ISBN-10 + if ($type === self::ISBN10 || $type === self::AUTO) { + if (empty($sep)) { + $pattern = '/^[0-9]{9}[0-9X]{1}$/'; + $length = 10; + } else { + $pattern = "/^[0-9]{1,7}[{$sep}]{1}[0-9]{1,7}[{$sep}]{1}[0-9]{1,7}[{$sep}]{1}[0-9X]{1}$/"; + $length = 13; + } + + $patterns[$pattern] = self::ISBN10; + $lengths[$pattern] = $length; + } + + // check for ISBN-13 + if ($type === self::ISBN13 || $type === self::AUTO) { + if (empty($sep)) { + $pattern = '/^[0-9]{13}$/'; + $length = 13; + } else { + // @codingStandardsIgnoreStart + $pattern = "/^[0-9]{1,9}[{$sep}]{1}[0-9]{1,5}[{$sep}]{1}[0-9]{1,9}[{$sep}]{1}[0-9]{1,9}[{$sep}]{1}[0-9]{1}$/"; + // @codingStandardsIgnoreEnd + $length = 17; + } + + $patterns[$pattern] = self::ISBN13; + $lengths[$pattern] = $length; + } + + // check pattern list + foreach ($patterns as $pattern => $type) { + if ((strlen($this->getValue()) === $lengths[$pattern]) && preg_match($pattern, $this->getValue())) { + return $type; + } + } + + return null; + } + + /** + * Returns true if and only if $value is a valid ISBN. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value) && ! is_int($value)) { + $this->error(self::INVALID); + return false; + } + + $value = (string) $value; + $originalValue = $value; + $this->setValue($value); + + switch ($this->detectFormat()) { + case self::ISBN10: + $isbn = new Isbn\Isbn10(); + break; + + case self::ISBN13: + $isbn = new Isbn\Isbn13(); + break; + + default: + $this->error(self::NO_ISBN); + return false; + } + + $value = str_replace($this->getSeparator(), '', $value); + $checksum = $isbn->getChecksum($value); + + // validate + if (substr($originalValue, -1) !== (string) $checksum) { + $this->error(self::NO_ISBN); + return false; + } + return true; + } + + /** + * Set separator characters. + * + * It is allowed only empty string, hyphen and space. + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param string $separator + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When $separator is not valid. + */ + public function setSeparator($separator) + { + // check separator + if (! in_array($separator, ['-', ' ', ''])) { + throw new Exception\InvalidArgumentException('Invalid ISBN separator.'); + } + + $this->options['separator'] = $separator; + return $this; + } + + /** + * Get separator characters. + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return string + */ + public function getSeparator() + { + return $this->options['separator']; + } + + /** + * Set allowed ISBN type. + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @param string $type + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException When $type is not valid. + */ + public function setType($type) + { + // check type + if (! in_array($type, [self::AUTO, self::ISBN10, self::ISBN13])) { + throw new Exception\InvalidArgumentException('Invalid ISBN type'); + } + + $this->options['type'] = $type; + return $this; + } + + /** + * Get allowed ISBN type. + * + * @deprecated Since 2.61.0 - All option getters and setters will be removed in 3.0 + * + * @return string + */ + public function getType() + { + return $this->options['type']; + } +} diff --git a/vendor/laminas/laminas-validator/src/Isbn/Isbn10.php b/vendor/laminas/laminas-validator/src/Isbn/Isbn10.php new file mode 100755 index 00000000..14fca5ed --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Isbn/Isbn10.php @@ -0,0 +1,59 @@ +sum($value); + return $this->checksum($sum); + } + + /** + * Calculate the value sum. + * + * @param string $value + * @return int + */ + private function sum($value) + { + $sum = 0; + + for ($i = 0; $i < 9; $i++) { + $sum += (10 - $i) * (int) $value[$i]; + } + + return $sum; + } + + /** + * Calculate the checksum for the value's sum. + * + * @param int $sum + * @return int|string + */ + private function checksum($sum) + { + $checksum = 11 - ($sum % 11); + + if ($checksum === 11) { + return '0'; + } + + if ($checksum === 10) { + return 'X'; + } + + return $checksum; + } +} diff --git a/vendor/laminas/laminas-validator/src/Isbn/Isbn13.php b/vendor/laminas/laminas-validator/src/Isbn/Isbn13.php new file mode 100755 index 00000000..8325e1b2 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Isbn/Isbn13.php @@ -0,0 +1,60 @@ +sum($value); + return $this->checksum($sum); + } + + /** + * Calculate the value sum. + * + * @param string $value + * @return int + */ + private function sum($value) + { + $sum = 0; + + for ($i = 0; $i < 12; $i++) { + if ($i % 2 === 0) { + $sum += (int) $value[$i]; + continue; + } + + $sum += 3 * (int) $value[$i]; + } + + return $sum; + } + + /** + * Calculate the checksum for the value's sum. + * + * @param int $sum + * @return int|string + */ + private function checksum($sum) + { + $checksum = 10 - ($sum % 10); + + if ($checksum === 10) { + return '0'; + } + + return $checksum; + } +} diff --git a/vendor/laminas/laminas-validator/src/LessThan.php b/vendor/laminas/laminas-validator/src/LessThan.php new file mode 100644 index 00000000..751099e4 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/LessThan.php @@ -0,0 +1,163 @@ + "The input is not less than '%max%'", + self::NOT_LESS_INCLUSIVE => "The input is not less or equal than '%max%'", + ]; + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = [ + 'max' => 'max', + ]; + + /** + * Maximum value + * + * @var mixed + */ + protected $max; + + /** + * Whether to do inclusive comparisons, allowing equivalence to max + * + * If false, then strict comparisons are done, and the value may equal + * the max option + * + * @var bool + */ + protected $inclusive; + + /** + * Sets validator options + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (! is_array($options)) { + $options = func_get_args(); + $temp['max'] = array_shift($options); + + if (! empty($options)) { + $temp['inclusive'] = array_shift($options); + } + + $options = $temp; + } + + if (! array_key_exists('max', $options)) { + throw new Exception\InvalidArgumentException("Missing option 'max'"); + } + + if (! array_key_exists('inclusive', $options)) { + $options['inclusive'] = false; + } + + $this->setMax($options['max']) + ->setInclusive($options['inclusive']); + + parent::__construct($options); + } + + /** + * Returns the max option + * + * @return mixed + */ + public function getMax() + { + return $this->max; + } + + /** + * Sets the max option + * + * @return $this Provides a fluent interface + */ + public function setMax(mixed $max) + { + $this->max = $max; + return $this; + } + + /** + * Returns the inclusive option + * + * @return bool + */ + public function getInclusive() + { + return $this->inclusive; + } + + /** + * Sets the inclusive option + * + * @param bool $inclusive + * @return $this Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->inclusive = $inclusive; + return $this; + } + + /** + * Returns true if and only if $value is less than max option, inclusively + * when the inclusive option is true + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if ($this->inclusive) { + if ($value > $this->max) { + $this->error(self::NOT_LESS_INCLUSIVE); + return false; + } + } else { + if ($value >= $this->max) { + $this->error(self::NOT_LESS); + return false; + } + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Module.php b/vendor/laminas/laminas-validator/src/Module.php new file mode 100644 index 00000000..06a7be84 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Module.php @@ -0,0 +1,45 @@ + $provider->getDependencyConfig(), + ]; + } + + /** + * Register a specification for the ValidatorManager with the ServiceListener. + * + * @deprecated ModuleManager support will be removed in version 3.0 of this component + * + * @param ModuleManager $moduleManager + * @return void + */ + public function init($moduleManager) + { + $event = $moduleManager->getEvent(); + $container = $event->getParam('ServiceManager'); + $serviceListener = $container->get('ServiceListener'); + + $serviceListener->addServiceManager( + 'ValidatorManager', + 'validators', + ValidatorProviderInterface::class, + 'getValidatorConfig' + ); + } +} diff --git a/vendor/laminas/laminas-validator/src/NotEmpty.php b/vendor/laminas/laminas-validator/src/NotEmpty.php new file mode 100644 index 00000000..57df0786 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/NotEmpty.php @@ -0,0 +1,313 @@ + */ + protected $constants = [ + self::BOOLEAN => 'boolean', + self::INTEGER => 'integer', + self::FLOAT => 'float', + self::STRING => 'string', + self::ZERO => 'zero', + self::EMPTY_ARRAY => 'array', + self::NULL => 'null', + self::PHP => 'php', + self::SPACE => 'space', + self::OBJECT => 'object', + self::OBJECT_STRING => 'objectstring', + self::OBJECT_COUNT => 'objectcount', + self::ALL => 'all', + ]; + + /** + * Default value for types; value = 0b000111101001 + * + * @var array + */ + protected $defaultType = [ + self::OBJECT, + self::SPACE, + self::NULL, + self::EMPTY_ARRAY, + self::STRING, + self::BOOLEAN, + ]; + + /** @var array */ + protected $messageTemplates = [ + self::IS_EMPTY => "Value is required and can't be empty", + self::INVALID => 'Invalid type given. String, integer, float, boolean or array expected', + ]; + + /** + * Options for this validator + * + * @var array + */ + protected $options = []; + + /** + * Constructor + * + * @param array|Traversable|int $options OPTIONAL + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (! is_array($options)) { + $options = func_get_args(); + $temp = []; + if (! empty($options)) { + $temp['type'] = array_shift($options); + } + + $options = $temp; + } + + if (! isset($options['type'])) { + if (($type = $this->calculateTypeValue($options)) !== 0) { + $options['type'] = $type; + } else { + $options['type'] = $this->defaultType; + } + } + + parent::__construct($options); + } + + /** + * Returns the set types + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @return int + */ + public function getType() + { + return $this->options['type']; + } + + /** + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @return false|int|string + */ + public function getDefaultType() + { + return $this->calculateTypeValue($this->defaultType); + } + + /** + * @param array|int|string $type + * @return false|int|string + */ + protected function calculateTypeValue($type) + { + if (is_array($type)) { + $detected = 0; + foreach ($type as $value) { + if (is_int($value)) { + $detected |= $value; + } elseif (in_array($value, $this->constants, true)) { + $detected |= (int) array_search($value, $this->constants, true); + } + } + + $type = $detected; + } elseif (is_string($type) && in_array($type, $this->constants, true)) { + $type = array_search($type, $this->constants, true); + } + + return $type; + } + + /** + * Set the types + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @param int|int[] $type + * @return $this + * @throws Exception\InvalidArgumentException + */ + public function setType($type = null) + { + $type = $this->calculateTypeValue($type); + + if (! is_int($type) || ($type < 0) || ($type > self::ALL)) { + throw new Exception\InvalidArgumentException('Unknown type'); + } + + $this->options['type'] = $type; + + return $this; + } + + /** + * Returns true if and only if $value is not an empty value. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if ( + $value !== null + && ! is_string($value) + && ! is_int($value) + && ! is_float($value) + && ! is_bool($value) + && ! is_array($value) + && ! is_object($value) + ) { + $this->error(self::INVALID); + return false; + } + + $type = $this->getType(); + $this->setValue($value); + $object = false; + + // OBJECT_COUNT (countable object) + if ($type & self::OBJECT_COUNT) { + $object = true; + + if (is_object($value) && $value instanceof Countable && (count($value) === 0)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // OBJECT_STRING (object's toString) + if ($type & self::OBJECT_STRING) { + $object = true; + + if ( + (is_object($value) && ! method_exists($value, '__toString')) + || (is_object($value) && method_exists($value, '__toString') && (string) $value === '') + ) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // OBJECT (object) + // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf + if ($type & self::OBJECT) { + // fall through, objects are always not empty + } elseif ($object === false) { + // object not allowed but object given -> return false + if (is_object($value)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // SPACE (' ') + if ($type & self::SPACE) { + if (is_string($value) && (preg_match('/^\s+$/s', $value))) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // NULL (null) + if ($type & self::NULL) { + if ($value === null) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // EMPTY_ARRAY (array()) + if ($type & self::EMPTY_ARRAY) { + if ($value === []) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // ZERO ('0') + if ($type & self::ZERO) { + if ($value === '0') { + $this->error(self::IS_EMPTY); + return false; + } + } + + // STRING ('') + if ($type & self::STRING) { + if ($value === '') { + $this->error(self::IS_EMPTY); + return false; + } + } + + // FLOAT (0.0) + if ($type & self::FLOAT) { + if ($value === 0.0) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // INTEGER (0) + if ($type & self::INTEGER) { + if ($value === 0) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // BOOLEAN (false) + if ($type & self::BOOLEAN) { + if ($value === false) { + $this->error(self::IS_EMPTY); + return false; + } + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/NumberComparison.php b/vendor/laminas/laminas-validator/src/NumberComparison.php new file mode 100644 index 00000000..c5ca6f13 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/NumberComparison.php @@ -0,0 +1,124 @@ + + * } + * @psalm-type Options = array{ + * min: numeric|null, + * max: numeric|null, + * inclusiveMin: bool, + * inclusiveMax: bool, + * } + */ +final class NumberComparison extends AbstractValidator +{ + public const ERROR_NOT_NUMERIC = 'notNumeric'; + public const ERROR_NOT_GREATER_INCLUSIVE = 'notGreaterInclusive'; + public const ERROR_NOT_GREATER = 'notGreater'; + public const ERROR_NOT_LESS_INCLUSIVE = 'notLessInclusive'; + public const ERROR_NOT_LESS = 'notLess'; + + /** @var array */ + protected array $messageTemplates = [ + self::ERROR_NOT_NUMERIC => 'Expected a numeric value', + self::ERROR_NOT_GREATER_INCLUSIVE => 'Values must be greater than or equal to %min%. Received "%value%"', + self::ERROR_NOT_GREATER => 'Values must be greater than %min%. Received "%value%', + self::ERROR_NOT_LESS_INCLUSIVE => 'Values must be less than or equal to %max%. Received "%value%"', + self::ERROR_NOT_LESS => 'Values must be less than %max%. Received "%value%"', + ]; + + /** @var array> */ + protected array $messageVariables = [ + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + ]; + + /** @var Options */ + protected array $options = [ + 'min' => null, + 'max' => null, + 'inclusiveMin' => true, + 'inclusiveMax' => true, + ]; + + /** @param OptionsArgument $options */ + public function __construct(array $options = []) + { + parent::__construct($options); + + $min = $options['min'] ?? null; + $max = $options['max'] ?? null; + + if (! is_numeric($min) && ! is_numeric($max)) { + throw new InvalidArgumentException( + 'A numeric option value for either min, max or both must be provided', + ); + } + + if ($min !== null && $max !== null && $min > $max) { + throw new InvalidArgumentException( + 'The minimum constraint cannot be greater than the maximum constraint', + ); + } + + $this->options['min'] = $min; + $this->options['max'] = $max; + $this->options['inclusiveMin'] = $options['inclusiveMin'] ?? true; + $this->options['inclusiveMax'] = $options['inclusiveMax'] ?? true; + } + + public function isValid(mixed $value): bool + { + if (! is_numeric($value)) { + $this->error(self::ERROR_NOT_NUMERIC); + + return false; + } + + $this->setValue($value); + + $min = $this->options['min']; + $max = $this->options['max']; + $inclusiveMin = $this->options['inclusiveMin']; + $inclusiveMax = $this->options['inclusiveMax']; + + if ($min !== null && $inclusiveMin && $value < $min) { + $this->error(self::ERROR_NOT_GREATER_INCLUSIVE); + + return false; + } + + if ($min !== null && ! $inclusiveMin && $value <= $min) { + $this->error(self::ERROR_NOT_GREATER); + + return false; + } + + if ($max !== null && $inclusiveMax && $value > $max) { + $this->error(self::ERROR_NOT_LESS_INCLUSIVE); + + return false; + } + + if ($max !== null && ! $inclusiveMax && $value >= $max) { + $this->error(self::ERROR_NOT_LESS); + + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Regex.php b/vendor/laminas/laminas-validator/src/Regex.php new file mode 100644 index 00000000..02cf6dd3 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Regex.php @@ -0,0 +1,145 @@ + 'Invalid type given. String, integer or float expected', + self::NOT_MATCH => "The input does not match against pattern '%pattern%'", + self::ERROROUS => "There was an internal error while using the pattern '%pattern%'", + ]; + + /** @var array */ + protected $messageVariables = [ + 'pattern' => 'pattern', + ]; + + /** + * Regular expression pattern + * + * @var non-empty-string + */ + protected $pattern; + + /** + * Sets validator options + * + * @param non-empty-string|array|Traversable $pattern + * @throws Exception\InvalidArgumentException On missing 'pattern' parameter. + */ + public function __construct($pattern) + { + if (is_string($pattern)) { + $this->setPattern($pattern); + parent::__construct([]); + return; + } + + if ($pattern instanceof Traversable) { + $pattern = ArrayUtils::iteratorToArray($pattern); + } + + if (! is_array($pattern)) { + throw new Exception\InvalidArgumentException('Invalid options provided to constructor'); + } + + if (! array_key_exists('pattern', $pattern) || ! is_string($pattern['pattern']) || $pattern['pattern'] === '') { + throw new Exception\InvalidArgumentException("Missing option 'pattern'"); + } + + $this->setPattern($pattern['pattern']); + unset($pattern['pattern']); + parent::__construct($pattern); + } + + /** + * Returns the pattern option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return non-empty-string|null + */ + public function getPattern() + { + return $this->pattern; + } + + /** + * Sets the pattern option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param non-empty-string $pattern + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException If there is a fatal error in pattern matching. + */ + public function setPattern($pattern) + { + ErrorHandler::start(); + $this->pattern = (string) $pattern; + $status = preg_match($this->pattern, 'Test'); + $error = ErrorHandler::stop(); + + if (false === $status) { + throw new Exception\InvalidArgumentException( + "Internal error parsing the pattern '{$this->pattern}'", + 0, + $error + ); + } + + return $this; + } + + /** + * Returns true if and only if $value matches against the pattern option + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value) && ! is_int($value) && ! is_float($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + ErrorHandler::start(); + $status = preg_match($this->pattern, (string) $value); + ErrorHandler::stop(); + if (false === $status) { + $this->error(self::ERROROUS); + return false; + } + + if (! $status) { + $this->error(self::NOT_MATCH); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Sitemap/Changefreq.php b/vendor/laminas/laminas-validator/src/Sitemap/Changefreq.php new file mode 100644 index 00000000..83ff0642 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Sitemap/Changefreq.php @@ -0,0 +1,74 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @final + */ +class Changefreq extends AbstractValidator +{ + /** + * Validation key for not valid + */ + public const NOT_VALID = 'sitemapChangefreqNotValid'; + public const INVALID = 'sitemapChangefreqInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = [ + self::NOT_VALID => 'The input is not a valid sitemap changefreq', + self::INVALID => 'Invalid type given. String expected', + ]; + + /** + * Valid change frequencies + * + * @var array + */ + protected $changeFreqs = [ + 'always', + 'hourly', + 'daily', + 'weekly', + 'monthly', + 'yearly', + 'never', + ]; + + /** + * Validates if a string is valid as a sitemap changefreq + * + * @link http://www.sitemaps.org/protocol.php#changefreqdef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + if (! in_array($value, $this->changeFreqs, true)) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Sitemap/Lastmod.php b/vendor/laminas/laminas-validator/src/Sitemap/Lastmod.php new file mode 100644 index 00000000..a13f1ca1 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Sitemap/Lastmod.php @@ -0,0 +1,71 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @final + */ +class Lastmod extends AbstractValidator +{ + // phpcs:disable Generic.Files.LineLength.TooLong + + /** + * Regular expression to use when validating + */ + public const LASTMOD_REGEX = '/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9])(:[0-5][0-9])?(\\+|-)([0-1][0-9]|2[0-3]):[0-5][0-9])?$/'; + + // phpcs:enable + + /** + * Validation key for not valid + */ + public const NOT_VALID = 'sitemapLastmodNotValid'; + public const INVALID = 'sitemapLastmodInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = [ + self::NOT_VALID => 'The input is not a valid sitemap lastmod', + self::INVALID => 'Invalid type given. String expected', + ]; + + /** + * Validates if a string is valid as a sitemap lastmod + * + * @link http://www.sitemaps.org/protocol.php#lastmoddef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + ErrorHandler::start(); + $result = preg_match(self::LASTMOD_REGEX, $value); + ErrorHandler::stop(); + if ($result !== 1) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Sitemap/Loc.php b/vendor/laminas/laminas-validator/src/Sitemap/Loc.php new file mode 100644 index 00000000..b82f3d2e --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Sitemap/Loc.php @@ -0,0 +1,60 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * @see Laminas\Uri\Uri + * + * @final + */ +class Loc extends AbstractValidator +{ + /** + * Validation key for not valid + */ + public const NOT_VALID = 'sitemapLocNotValid'; + public const INVALID = 'sitemapLocInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = [ + self::NOT_VALID => 'The input is not a valid sitemap location', + self::INVALID => 'Invalid type given. String expected', + ]; + + /** + * Validates if a string is valid as a sitemap location + * + * @link http://www.sitemaps.org/protocol.php#locdef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + $uri = Uri\UriFactory::factory($value); + if (! $uri->isValid()) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Sitemap/Priority.php b/vendor/laminas/laminas-validator/src/Sitemap/Priority.php new file mode 100644 index 00000000..f61a1a44 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Sitemap/Priority.php @@ -0,0 +1,58 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @final + */ +class Priority extends AbstractValidator +{ + /** + * Validation key for not valid + */ + public const NOT_VALID = 'sitemapPriorityNotValid'; + public const INVALID = 'sitemapPriorityInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = [ + self::NOT_VALID => 'The input is not a valid sitemap priority', + self::INVALID => 'Invalid type given. Numeric string, integer or float expected', + ]; + + /** + * Validates if a string is valid as a sitemap priority + * + * @link http://www.sitemaps.org/protocol.php#prioritydef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (! is_numeric($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + $value = (float) $value; + if ($value < 0 || $value > 1) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/StaticValidator.php b/vendor/laminas/laminas-validator/src/StaticValidator.php new file mode 100644 index 00000000..682dcef4 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/StaticValidator.php @@ -0,0 +1,76 @@ +configure(['shared_by_default' => false]); + } else { + $plugins->setShareByDefault(false); + } + } + static::$plugins = $plugins; + } + + /** + * Get plugin manager for locating validators + * + * @return ValidatorPluginManager + */ + public static function getPluginManager() + { + if (! static::$plugins instanceof ValidatorPluginManager) { + $plugins = new ValidatorPluginManager(new ServiceManager()); + static::setPluginManager($plugins); + + return $plugins; + } + return static::$plugins; + } + + /** + * @param class-string $classBaseName + * @param array $options OPTIONAL associative array of options to pass as + * the sole argument to the validator constructor. + * @return bool + * @throws Exception\InvalidArgumentException For an invalid $options argument. + */ + public static function execute(mixed $value, $classBaseName, array $options = []) + { + if ($options && array_values($options) === $options) { + throw new Exception\InvalidArgumentException( + 'Invalid options provided via $options argument; must be an associative array' + ); + } + + $plugins = static::getPluginManager(); + $validator = $plugins->get($classBaseName, $options); + + return $validator->isValid($value); + } +} diff --git a/vendor/laminas/laminas-validator/src/Step.php b/vendor/laminas/laminas-validator/src/Step.php new file mode 100644 index 00000000..6bc93440 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Step.php @@ -0,0 +1,188 @@ + 'Invalid value given. Scalar expected', + self::NOT_STEP => 'The input is not a valid step', + ]; + + /** @var numeric */ + protected $baseValue = 0; + + /** @var numeric */ + protected $step = 1; + + /** + * Set default options for this instance + * + * @param iterable $options + */ + public function __construct($options = []) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } elseif (! is_array($options)) { + $options = func_get_args(); + $temp['baseValue'] = array_shift($options); + if (! empty($options)) { + $temp['step'] = array_shift($options); + } + + $options = $temp; + } + + if (isset($options['baseValue'])) { + $this->setBaseValue($options['baseValue']); + } + if (isset($options['step'])) { + $this->setStep($options['step']); + } + + parent::__construct($options); + } + + /** + * Sets the base value from which the step should be computed + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @param numeric $baseValue + * @return $this + */ + public function setBaseValue(mixed $baseValue) + { + $this->baseValue = $baseValue; + return $this; + } + + /** + * Returns the base value from which the step should be computed + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @return numeric + */ + public function getBaseValue() + { + return $this->baseValue; + } + + /** + * Sets the step value + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @param numeric $step + * @return $this + */ + public function setStep(mixed $step) + { + $this->step = (float) $step; + return $this; + } + + /** + * Returns the step value + * + * @deprecated Since 2.61.0 All option getters and setters will be removed in v3.0 + * + * @return numeric + */ + public function getStep() + { + return $this->step; + } + + /** + * Returns true if $value is a scalar and a valid step value + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (! is_numeric($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + $substract = $this->sub($value, $this->baseValue); + + $fmod = $this->fmod($substract, $this->step); + + if ($fmod !== 0.0 && $fmod !== $this->step) { + $this->error(self::NOT_STEP); + return false; + } + + return true; + } + + /** + * replaces the internal fmod function which give wrong results on many cases + * + * @param numeric $x + * @param numeric $y + * @return float + */ + protected function fmod($x, $y) + { + if ($y === 0.0 || $y === 0) { + return 1.0; + } + + //find the maximum precision from both input params to give accurate results + $precision = $this->getPrecision($x) + $this->getPrecision($y); + + return round($x - $y * floor($x / $y), $precision); + } + + /** + * replaces the internal substraction operation which give wrong results on some cases + * + * @param numeric $x + * @param numeric $y + * @return float + */ + private function sub($x, $y) + { + $precision = $this->getPrecision($x) + $this->getPrecision($y); + return round($x - $y, $precision); + } + + /** + * @param numeric $float + */ + private function getPrecision($float): int + { + $position = strpos((string) $float, '.'); + $segment = $position === false + ? null + : substr((string) $float, $position + 1); + + return $segment !== null ? strlen($segment) : 0; + } +} diff --git a/vendor/laminas/laminas-validator/src/StringLength.php b/vendor/laminas/laminas-validator/src/StringLength.php new file mode 100644 index 00000000..d02f2a6a --- /dev/null +++ b/vendor/laminas/laminas-validator/src/StringLength.php @@ -0,0 +1,254 @@ + */ + protected $messageTemplates = [ + self::INVALID => 'Invalid type given. String expected', + self::TOO_SHORT => 'The input is less than %min% characters long', + self::TOO_LONG => 'The input is more than %max% characters long', + ]; + + /** @var array> */ + protected $messageVariables = [ + 'min' => ['options' => 'min'], + 'max' => ['options' => 'max'], + 'length' => ['options' => 'length'], + ]; + + /** @var array */ + protected $options = [ + 'min' => 0, // Minimum length + 'max' => null, // Maximum length, null if there is no length limitation + 'encoding' => 'UTF-8', // Encoding to use + 'length' => 0, // Actual length + ]; + + /** @var null|StringWrapperInterface */ + protected $stringWrapper; + + /** + * Sets validator options + * + * @param int|array|Traversable $options + */ + public function __construct($options = []) + { + if (! is_array($options)) { + $options = func_get_args(); + $temp['min'] = array_shift($options); + if (! empty($options)) { + $temp['max'] = array_shift($options); + } + + if (! empty($options)) { + $temp['encoding'] = array_shift($options); + } + + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Returns the min option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return int + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the min option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param int $min + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setMin($min) + { + if (null !== $this->getMax() && $min > $this->getMax()) { + throw new Exception\InvalidArgumentException( + "The minimum must be less than or equal to the maximum length, but {$min} > {$this->getMax()}" + ); + } + + $this->options['min'] = max(0, (int) $min); + return $this; + } + + /** + * Returns the max option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return int|null + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the max option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param int|null $max + * @return $this Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setMax($max) + { + if (null === $max) { + $this->options['max'] = null; + } elseif ($max < $this->getMin()) { + throw new Exception\InvalidArgumentException( + "The maximum must be greater than or equal to the minimum length, but {$max} < {$this->getMin()}" + ); + } else { + $this->options['max'] = (int) $max; + } + + return $this; + } + + /** + * Get the string wrapper to detect the string length + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return StringWrapper + */ + public function getStringWrapper() + { + if (! $this->stringWrapper) { + $this->stringWrapper = StringUtils::getWrapper($this->getEncoding()); + } + return $this->stringWrapper; + } + + /** + * Set the string wrapper to detect the string length + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return void + */ + public function setStringWrapper(StringWrapper $stringWrapper) + { + $stringWrapper->setEncoding($this->getEncoding()); + $this->stringWrapper = $stringWrapper; + } + + /** + * Returns the actual encoding + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return string + */ + public function getEncoding() + { + return $this->options['encoding']; + } + + /** + * Sets a new encoding to use + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param string $encoding + * @return $this + * @throws Exception\InvalidArgumentException + */ + public function setEncoding($encoding) + { + $this->stringWrapper = StringUtils::getWrapper($encoding); + $this->options['encoding'] = $encoding; + return $this; + } + + /** + * Returns the length option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @return int + */ + private function getLength() + { + return $this->options['length']; + } + + /** + * Sets the length option + * + * @deprecated Since 2.60.0 all option setters and getters are deprecated for removal in 3.0 + * + * @param int $length + * @return $this Provides a fluent interface + */ + private function setLength($length) + { + $this->options['length'] = (int) $length; + return $this; + } + + /** + * Returns true if and only if the string length of $value is at least the min option and + * no greater than the max option (when the max option is not null). + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + $this->setLength($this->getStringWrapper()->strlen($value)); + if ($this->getLength() < $this->getMin()) { + $this->error(self::TOO_SHORT); + } + + if (null !== $this->getMax() && $this->getMax() < $this->getLength()) { + $this->error(self::TOO_LONG); + } + + if ($this->getMessages()) { + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/Timezone.php b/vendor/laminas/laminas-validator/src/Timezone.php new file mode 100644 index 00000000..7aa4da99 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Timezone.php @@ -0,0 +1,175 @@ + 'location', + self::ABBREVIATION => 'abbreviation', + ]; + + /** + * Default value for types; value = 3 + * + * @var array + */ + protected $defaultType = [ + self::LOCATION, + self::ABBREVIATION, + ]; + + /** @var array */ + protected $messageTemplates = [ + self::INVALID => 'Invalid timezone given.', + self::INVALID_TIMEZONE_LOCATION => 'Invalid timezone location given.', + self::INVALID_TIMEZONE_ABBREVIATION => 'Invalid timezone abbreviation given.', + ]; + + /** + * Options for this validator + * + * @var array + */ + protected $options = []; + + /** + * Constructor + * + * @param array|int $options OPTIONAL + */ + public function __construct($options = []) + { + $opts['type'] = $this->defaultType; + + if (is_array($options)) { + if (array_key_exists('type', $options)) { + $opts['type'] = $options['type']; + } + } elseif (! empty($options)) { + $opts['type'] = $options; + } + + // setType called by parent constructor then setOptions method + parent::__construct($opts); + } + + /** + * Set the types + * + * @deprecated Since 2.60.0 All option setters and getters will be removed in v3.0 + * + * @param int|array $type + * @return void + * @throws Exception\InvalidArgumentException + */ + public function setType($type = null) + { + $type = $this->calculateTypeValue($type); + + if (! is_int($type) || ($type < 1) || ($type > self::ALL)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Unknown type "%s" provided', + is_string($type) || is_int($type) + ? $type : gettype($type) + )); + } + + $this->options['type'] = $type; + } + + /** + * Returns true if timezone location or timezone abbreviations is correct. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if ($value !== null && ! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $type = $this->options['type']; + $this->setValue($value); + + switch (true) { + // Check in locations and abbreviations + case ($type & self::LOCATION) && ($type & self::ABBREVIATION): + $abbrs = DateTimeZone::listAbbreviations(); + $locations = DateTimeZone::listIdentifiers(); + + if (! array_key_exists($value, $abbrs) && ! in_array($value, $locations)) { + $this->error(self::INVALID); + return false; + } + break; + + // Check only in locations + case $type & self::LOCATION: + $locations = DateTimeZone::listIdentifiers(); + + if (! in_array($value, $locations)) { + $this->error(self::INVALID_TIMEZONE_LOCATION); + return false; + } + break; + + // Check only in abbreviations + case $type & self::ABBREVIATION: + $abbrs = DateTimeZone::listAbbreviations(); + + if (! array_key_exists($value, $abbrs)) { + $this->error(self::INVALID_TIMEZONE_ABBREVIATION); + return false; + } + break; + } + + return true; + } + + /** + * @deprecated Since 2.60.0 This method wil be removed in 3.0 + * + * @param array|int|string $type + * @return float|int + */ + protected function calculateTypeValue($type) + { + $types = (array) $type; + $detected = 0; + + foreach ($types as $value) { + if (is_int($value)) { + $detected |= $value; + } elseif (false !== array_search($value, $this->constants)) { + $detected |= array_search($value, $this->constants); + } + } + + return $detected; + } +} diff --git a/vendor/laminas/laminas-validator/src/Translator/DummyTranslator.php b/vendor/laminas/laminas-validator/src/Translator/DummyTranslator.php new file mode 100644 index 00000000..12aff89f --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Translator/DummyTranslator.php @@ -0,0 +1,27 @@ +translator->translate($message, $textDomain, $locale); + } + + /** + * Provide a pluralized translation of the given string using the given text domain and locale + * + * @param string $singular + * @param string $plural + * @param int $number + * @param string $textDomain + * @param string $locale + * @return string + */ + public function translatePlural($singular, $plural, $number, $textDomain = 'default', $locale = null) + { + return $this->translator->translatePlural($singular, $plural, $number, $textDomain, $locale); + } +} diff --git a/vendor/laminas/laminas-validator/src/Translator/TranslatorAwareInterface.php b/vendor/laminas/laminas-validator/src/Translator/TranslatorAwareInterface.php new file mode 100644 index 00000000..0d3f8961 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Translator/TranslatorAwareInterface.php @@ -0,0 +1,74 @@ +has(TranslatorInterface::class)) { + return new Translator($container->get(TranslatorInterface::class)); + } + + return $this->marshalTranslator($container); + } + + /** + * Marshal an Translator. + * + * If configuration exists, will pass it to the I18nTranslator::factory, + * decorating the returned instance in an MvcTranslator. + * + * Otherwise: + * + * - returns an Translator decorating a DummyTranslator instance if + * ext/intl is not loaded. + * - returns an Translator decorating an empty I18nTranslator instance. + */ + private function marshalTranslator(ContainerInterface $container): Translator + { + // Load a translator from configuration, if possible + $translator = $this->marshalTranslatorFromConfig($container); + + if ($translator instanceof Translator) { + return $translator; + } + + // If ext/intl is not loaded, return a dummy translator + if (! extension_loaded('intl')) { + return new Translator(new DummyTranslator()); + } + + return new Translator(new I18nTranslator()); + } + + /** + * Attempt to marshal a translator from configuration. + * + * Returns: + * - an Translator seeded with a DummyTranslator if "translator" + * configuration is available, and evaluates to boolean false. + * - an Translator seed with an I18nTranslator if "translator" + * configuration is available, and is a non-empty array or a Traversable + * instance. + * - null in all other cases, including absence of a configuration service. + */ + private function marshalTranslatorFromConfig(ContainerInterface $container): ?Translator + { + if (! $container->has('config')) { + return null; + } + + $config = $container->get('config'); + + if (! is_array($config) || ! array_key_exists('translator', $config)) { + return null; + } + + // 'translator' => false + if ($config['translator'] === false) { + return new Translator(new DummyTranslator()); + } + + // Empty translator configuration + if (is_array($config['translator']) && empty($config['translator'])) { + return null; + } + + // Unusable translator configuration + if (! is_array($config['translator']) && ! $config['translator'] instanceof Traversable) { + return null; + } + + // Create translator from configuration + $i18nTranslator = I18nTranslator::factory($config['translator']); + + // Inject plugins, if present + if ($container->has('TranslatorPluginManager')) { + $loaderManager = $container->get('TranslatorPluginManager'); + + assert($loaderManager instanceof LoaderPluginManager); + + $i18nTranslator->setPluginManager($loaderManager); + } + + // Inject into service manager instances + if ($container instanceof ServiceManager) { + $container->setService(TranslatorInterface::class, $i18nTranslator); + } + + return new Translator($i18nTranslator); + } +} diff --git a/vendor/laminas/laminas-validator/src/Translator/TranslatorInterface.php b/vendor/laminas/laminas-validator/src/Translator/TranslatorInterface.php new file mode 100644 index 00000000..77d5f72e --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Translator/TranslatorInterface.php @@ -0,0 +1,18 @@ + */ + protected $messageTemplates = [ + self::PASSWORD_BREACHED => 'The provided password was found in previous breaches, please create another password', + self::NOT_A_STRING => 'The provided password is not a string, please provide a correct password', + ]; + + // phpcs:enable + public function __construct(private ClientInterface $httpClient, private RequestFactoryInterface $makeHttpRequest) + { + parent::__construct(); + } + + // The following rule is buggy for parameters attributes + // phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHintSpacing.NoSpaceBetweenTypeHintAndParameter + + /** {@inheritDoc} */ + public function isValid( + #[SensitiveParameter] + $value + ): bool { + if (! is_string($value)) { + $this->error(self::NOT_A_STRING); + return false; + } + + if ($this->isPwnedPassword($value)) { + $this->error(self::PASSWORD_BREACHED); + return false; + } + + return true; + } + + // phpcs:enable SlevomatCodingStandard.TypeHints.ParameterTypeHintSpacing.NoSpaceBetweenTypeHintAndParameter + + private function isPwnedPassword( + #[SensitiveParameter] + string $password + ): bool { + $sha1Hash = $this->hashPassword($password); + $rangeHash = $this->getRangeHash($sha1Hash); + $hashList = $this->retrieveHashList($rangeHash); + + return $this->hashInResponse($sha1Hash, $hashList); + } + + /** + * We use a SHA1 hashed password for checking it against + * the breached data set of HIBP. + */ + private function hashPassword( + #[SensitiveParameter] + string $password + ): string { + $hashedPassword = sha1($password); + + return strtoupper($hashedPassword); + } + + /** + * Creates a hash range that will be send to HIBP API + * applying K-Anonymity + * + * @see https://www.troyhunt.com/enhancing-pwned-passwords-privacy-by-exclusively-supporting-anonymity/ + */ + private function getRangeHash( + #[SensitiveParameter] + string $passwordHash + ): string { + return substr($passwordHash, self::HIBP_K_ANONYMITY_HASH_RANGE_BASE, self::HIBP_K_ANONYMITY_HASH_RANGE_LENGTH); + } + + /** + * Making a connection to the HIBP API to retrieve a + * list of hashes that all have the same range as we + * provided. + * + * @throws ClientExceptionInterface + */ + private function retrieveHashList( + #[SensitiveParameter] + string $passwordRange + ): string { + $request = $this->makeHttpRequest->createRequest( + 'GET', + self::HIBP_API_URI . '/range/' . $passwordRange + ); + + $response = $this->httpClient->sendRequest($request); + return (string) $response->getBody(); + } + + /** + * Checks if the password is in the response from HIBP + */ + private function hashInResponse( + #[SensitiveParameter] + string $sha1Hash, + #[SensitiveParameter] + string $resultStream + ): bool { + $data = explode("\r\n", $resultStream); + $hashes = array_filter($data, static function ($value) use ($sha1Hash): bool { + [$hash] = explode(':', $value); + + return strcmp($hash, substr($sha1Hash, self::HIBP_K_ANONYMITY_HASH_RANGE_LENGTH)) === 0; + }); + + return $hashes !== []; + } +} diff --git a/vendor/laminas/laminas-validator/src/Uri.php b/vendor/laminas/laminas-validator/src/Uri.php new file mode 100644 index 00000000..6520f2cc --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Uri.php @@ -0,0 +1,189 @@ + */ + protected $messageTemplates = [ + self::INVALID => 'Invalid type given. String expected', + self::NOT_URI => 'The input does not appear to be a valid Uri', + ]; + + /** @var UriHandler|null|class-string */ + protected $uriHandler; + + /** @var bool */ + protected $allowRelative = true; + + /** @var bool */ + protected $allowAbsolute = true; + + /** + * Sets default option values for this instance + * + * @param array|Traversable $options + */ + public function __construct($options = []) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } elseif (! is_array($options)) { + $options = func_get_args(); + $temp['uriHandler'] = array_shift($options); + if (! empty($options)) { + $temp['allowRelative'] = array_shift($options); + } + if (! empty($options)) { + $temp['allowAbsolute'] = array_shift($options); + } + + $options = $temp; + } + + if (isset($options['uriHandler'])) { + $this->setUriHandler($options['uriHandler']); + } + if (isset($options['allowRelative'])) { + $this->setAllowRelative($options['allowRelative']); + } + if (isset($options['allowAbsolute'])) { + $this->setAllowAbsolute($options['allowAbsolute']); + } + + parent::__construct($options); + } + + /** + * @throws InvalidArgumentException + * @return UriHandler + */ + public function getUriHandler() + { + if (null === $this->uriHandler) { + // Lazy load the base Uri handler + $this->uriHandler = new UriHandler(); + } elseif (is_string($this->uriHandler) && class_exists($this->uriHandler)) { + // Instantiate string Uri handler that references a class + $this->uriHandler = new $this->uriHandler(); + } + assert($this->uriHandler !== null && ! is_string($this->uriHandler)); + + return $this->uriHandler; + } + + /** + * @param UriHandler|class-string $uriHandler + * @throws InvalidArgumentException + * @return $this + */ + public function setUriHandler($uriHandler) + { + if (! is_a($uriHandler, UriHandler::class, true)) { + throw new InvalidArgumentException(sprintf( + 'Expecting a subclass name or instance of %s as $uriHandler', + UriHandler::class + )); + } + + $this->uriHandler = $uriHandler; + return $this; + } + + /** + * Returns the allowAbsolute option + * + * @return bool + */ + public function getAllowAbsolute() + { + return $this->allowAbsolute; + } + + /** + * Sets the allowAbsolute option + * + * @param bool $allowAbsolute + * @return $this + */ + public function setAllowAbsolute($allowAbsolute) + { + $this->allowAbsolute = (bool) $allowAbsolute; + return $this; + } + + /** + * Returns the allowRelative option + * + * @return bool + */ + public function getAllowRelative() + { + return $this->allowRelative; + } + + /** + * Sets the allowRelative option + * + * @param bool $allowRelative + * @return $this + */ + public function setAllowRelative($allowRelative) + { + $this->allowRelative = (bool) $allowRelative; + return $this; + } + + /** + * Returns true if and only if $value validates as a Uri + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $uriHandler = $this->getUriHandler(); + try { + $uriHandler->parse($value); + if ($uriHandler->isValid()) { + // It will either be a valid absolute or relative URI + if ( + ($this->allowRelative && $this->allowAbsolute) + || ($this->allowAbsolute && $uriHandler->isAbsolute()) + || ($this->allowRelative && $uriHandler->isValidRelative()) + ) { + return true; + } + } + } catch (UriException) { + // Error parsing URI, it must be invalid + } + + $this->error(self::NOT_URI); + return false; + } +} diff --git a/vendor/laminas/laminas-validator/src/Uuid.php b/vendor/laminas/laminas-validator/src/Uuid.php new file mode 100644 index 00000000..77ecdd8b --- /dev/null +++ b/vendor/laminas/laminas-validator/src/Uuid.php @@ -0,0 +1,58 @@ + 'Invalid type given; string expected', + self::INVALID => 'Invalid UUID format', + ]; + + /** + * Returns true if and only if $value meets the validation requirements. + * + * If $value fails validation, then this method returns false, and + * getMessages() will return an array of messages that explain why the + * validation failed. + * + * @param mixed $value + * @return bool + * @throws Exception\RuntimeException If validation of $value is impossible. + */ + public function isValid($value) + { + if (! is_string($value)) { + $this->error(self::NOT_STRING); + return false; + } + + $this->setValue($value); + + if ( + empty($value) + || $value !== '00000000-0000-0000-0000-000000000000' + && ! preg_match(self::REGEX_UUID, $value) + ) { + $this->error(self::INVALID); + return false; + } + + return true; + } +} diff --git a/vendor/laminas/laminas-validator/src/ValidatorChain.php b/vendor/laminas/laminas-validator/src/ValidatorChain.php new file mode 100644 index 00000000..e77c19f1 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/ValidatorChain.php @@ -0,0 +1,340 @@ + + * @final + */ +class ValidatorChain implements Countable, IteratorAggregate, ValidatorInterface +{ + /** + * Default priority at which validators are added + */ + public const DEFAULT_PRIORITY = 1; + + /** @var ValidatorPluginManager|null */ + protected $plugins; + + /** + * Validator chain + * + * @var PriorityQueue + */ + protected $validators; + + /** + * Array of validation failure messages + * + * @var array + */ + protected $messages = []; + + /** + * Initialize validator chain + */ + public function __construct() + { + $this->validators = new PriorityQueue(); + } + + /** + * Return the count of attached validators + * + * @return int + */ + #[ReturnTypeWillChange] + public function count() + { + return count($this->validators); + } + + /** + * Get plugin manager instance + * + * @return ValidatorPluginManager + */ + public function getPluginManager() + { + if (! $this->plugins) { + $this->setPluginManager(new ValidatorPluginManager(new ServiceManager())); + } + return $this->plugins; + } + + /** + * Set plugin manager instance + * + * @param ValidatorPluginManager $plugins Plugin manager + * @psalm-assert ValidatorPluginManager $this->plugins + * @return $this + */ + public function setPluginManager(ValidatorPluginManager $plugins) + { + $this->plugins = $plugins; + return $this; + } + + /** + * Retrieve a validator by name + * + * @param string|class-string $name Name of validator to return + * @param null|array $options Options to pass to validator constructor + * (if not already instantiated) + * @return ValidatorInterface + * @template T of ValidatorInterface + * @psalm-param string|class-string $name + * @psalm-return ValidatorInterface + */ + public function plugin($name, ?array $options = null) + { + $plugins = $this->getPluginManager(); + return $plugins->get($name, $options); + } + + /** + * Attach a validator to the end of the chain + * If $breakChainOnFailure is true, then if the validator fails, the next validator in the chain, + * if one exists, will not be executed. + * + * @param bool $breakChainOnFailure + * @param int $priority Priority at which to enqueue validator; defaults to + * 1 (higher executes earlier) + * @return $this + * @throws Exception\InvalidArgumentException + */ + public function attach( + ValidatorInterface $validator, + $breakChainOnFailure = false, + $priority = self::DEFAULT_PRIORITY + ) { + /** @psalm-suppress RedundantCastGivenDocblockType */ + $this->validators->insert( + [ + 'instance' => $validator, + 'breakChainOnFailure' => (bool) $breakChainOnFailure, + ], + $priority + ); + + return $this; + } + + /** + * Proxy to attach() to keep BC + * + * @deprecated Please use attach() + * + * @param bool $breakChainOnFailure + * @param int $priority + * @return ValidatorChain Provides a fluent interface + */ + public function addValidator( + ValidatorInterface $validator, + $breakChainOnFailure = false, + $priority = self::DEFAULT_PRIORITY + ) { + return $this->attach($validator, $breakChainOnFailure, $priority); + } + + /** + * Adds a validator to the beginning of the chain + * + * If $breakChainOnFailure is true, then if the validator fails, the next validator in the chain, + * if one exists, will not be executed. + * + * @param bool $breakChainOnFailure + * @return $this Provides a fluent interface + */ + public function prependValidator(ValidatorInterface $validator, $breakChainOnFailure = false) + { + $priority = self::DEFAULT_PRIORITY; + + if (! $this->validators->isEmpty()) { + $extractedNodes = $this->validators->toArray(PriorityQueue::EXTR_PRIORITY); + rsort($extractedNodes, SORT_NUMERIC); + $priority = $extractedNodes[0] + 1; + } + + /** @psalm-suppress RedundantCastGivenDocblockType */ + $this->validators->insert( + [ + 'instance' => $validator, + 'breakChainOnFailure' => (bool) $breakChainOnFailure, + ], + $priority + ); + return $this; + } + + /** + * Use the plugin manager to add a validator by name + * + * @param string|class-string $name + * @param array $options + * @param bool $breakChainOnFailure + * @param int $priority + * @return $this + */ + public function attachByName($name, $options = [], $breakChainOnFailure = false, $priority = self::DEFAULT_PRIORITY) + { + if (isset($options['break_chain_on_failure'])) { + $breakChainOnFailure = (bool) $options['break_chain_on_failure']; + } + + if (isset($options['breakchainonfailure'])) { + $breakChainOnFailure = (bool) $options['breakchainonfailure']; + } + + $this->attach($this->plugin($name, $options), $breakChainOnFailure, $priority); + + return $this; + } + + /** + * Proxy to attachByName() to keep BC + * + * @deprecated Please use attachByName() + * + * @param string $name + * @param array $options + * @param bool $breakChainOnFailure + * @return ValidatorChain + */ + public function addByName($name, $options = [], $breakChainOnFailure = false) + { + return $this->attachByName($name, $options, $breakChainOnFailure); + } + + /** + * Use the plugin manager to prepend a validator by name + * + * @param string|class-string $name + * @param array $options + * @param bool $breakChainOnFailure + * @return $this + */ + public function prependByName($name, $options = [], $breakChainOnFailure = false) + { + $validator = $this->plugin($name, $options); + $this->prependValidator($validator, $breakChainOnFailure); + return $this; + } + + /** + * Returns true if and only if $value passes all validations in the chain + * + * Validators are run in the order in which they were added to the chain (FIFO). + * + * @param mixed $value + * @param mixed $context Extra "context" to provide the validator + * @return bool + */ + public function isValid($value, $context = null) + { + $this->messages = []; + $result = true; + foreach ($this as $element) { + $validator = $element['instance']; + assert($validator instanceof ValidatorInterface); + if ($validator->isValid($value, $context)) { + continue; + } + $result = false; + $messages = $validator->getMessages(); + $this->messages = array_replace($this->messages, $messages); + if ($element['breakChainOnFailure']) { + break; + } + } + return $result; + } + + /** + * Merge the validator chain with the one given in parameter + * + * @return $this + */ + public function merge(ValidatorChain $validatorChain) + { + foreach ($validatorChain->validators->toArray(PriorityQueue::EXTR_BOTH) as $item) { + $this->attach($item['data']['instance'], $item['data']['breakChainOnFailure'], $item['priority']); + } + + return $this; + } + + /** + * Returns array of validation failure messages + * + * @return array + */ + public function getMessages() + { + return $this->messages; + } + + /** + * Get all the validators + * + * @return list + */ + public function getValidators() + { + return $this->validators->toArray(PriorityQueue::EXTR_DATA); + } + + /** + * Invoke chain as command + * + * @return bool + */ + public function __invoke(mixed $value) + { + return $this->isValid($value); + } + + /** + * Deep clone handling + */ + public function __clone() + { + $this->validators = clone $this->validators; + } + + /** + * Prepare validator chain for serialization + * + * Plugin manager (property 'plugins') cannot + * be serialized. On wakeup the property remains unset + * and next invocation to getPluginManager() sets + * the default plugin manager instance (ValidatorPluginManager). + * + * @return array + */ + public function __sleep() + { + return ['validators', 'messages']; + } + + /** @return Traversable */ + public function getIterator(): Traversable + { + return clone $this->validators; + } +} diff --git a/vendor/laminas/laminas-validator/src/ValidatorInterface.php b/vendor/laminas/laminas-validator/src/ValidatorInterface.php new file mode 100644 index 00000000..af83fbd0 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/ValidatorInterface.php @@ -0,0 +1,39 @@ +, + * priority?: int, + * break_chain_on_failure?: bool, + * options?: array, + * } + */ +interface ValidatorInterface +{ + /** + * Returns true if and only if $value meets the validation requirements + * + * If $value fails validation, then this method returns false, and + * getMessages() will return an array of messages that explain why the + * validation failed. + * + * @param mixed $value + * @return bool + * @throws Exception\RuntimeException If validation of $value is impossible. + */ + public function isValid($value); + + /** + * Returns an array of messages that explain why the most recent isValid() + * call returned false. The array keys are validation failure message identifiers, + * and the array values are the corresponding human-readable message strings. + * + * If isValid() was never called or if the most recent isValid() call + * returned true, then this method returns an empty array. + * + * @return array + */ + public function getMessages(); +} diff --git a/vendor/laminas/laminas-validator/src/ValidatorPluginManager.php b/vendor/laminas/laminas-validator/src/ValidatorPluginManager.php new file mode 100644 index 00000000..5a49b470 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/ValidatorPluginManager.php @@ -0,0 +1,634 @@ + + * @final + */ +class ValidatorPluginManager extends AbstractPluginManager +{ + /** + * Default set of aliases + * + * @inheritDoc + */ + protected $aliases = [ + 'alnum' => I18nValidator\Alnum::class, + 'Alnum' => I18nValidator\Alnum::class, + 'alpha' => I18nValidator\Alpha::class, + 'Alpha' => I18nValidator\Alpha::class, + 'barcode' => Barcode::class, + 'Barcode' => Barcode::class, + 'between' => Between::class, + 'Between' => Between::class, + 'BIC' => BusinessIdentifierCode::class, + 'bic' => BusinessIdentifierCode::class, + 'bitwise' => Bitwise::class, + 'Bitwise' => Bitwise::class, + 'BusinessIdentifierCode' => BusinessIdentifierCode::class, + 'businessidentifiercode' => BusinessIdentifierCode::class, + 'callback' => Callback::class, + 'Callback' => Callback::class, + 'creditcard' => CreditCard::class, + 'creditCard' => CreditCard::class, + 'CreditCard' => CreditCard::class, + 'csrf' => Csrf::class, + 'Csrf' => Csrf::class, + 'date' => Date::class, + 'Date' => Date::class, + 'datestep' => DateStep::class, + 'dateStep' => DateStep::class, + 'DateStep' => DateStep::class, + 'datetime' => I18nValidator\DateTime::class, + 'dateTime' => I18nValidator\DateTime::class, + 'DateTime' => I18nValidator\DateTime::class, + 'dbnorecordexists' => Db\NoRecordExists::class, + 'dbNoRecordExists' => Db\NoRecordExists::class, + 'DbNoRecordExists' => Db\NoRecordExists::class, + 'dbrecordexists' => Db\RecordExists::class, + 'dbRecordExists' => Db\RecordExists::class, + 'DbRecordExists' => Db\RecordExists::class, + 'digits' => Digits::class, + 'Digits' => Digits::class, + 'emailaddress' => EmailAddress::class, + 'emailAddress' => EmailAddress::class, + 'EmailAddress' => EmailAddress::class, + 'explode' => Explode::class, + 'Explode' => Explode::class, + 'filecount' => File\Count::class, + 'fileCount' => File\Count::class, + 'FileCount' => File\Count::class, + 'filecrc32' => File\Crc32::class, + 'fileCrc32' => File\Crc32::class, + 'FileCrc32' => File\Crc32::class, + 'fileexcludeextension' => File\ExcludeExtension::class, + 'fileExcludeExtension' => File\ExcludeExtension::class, + 'FileExcludeExtension' => File\ExcludeExtension::class, + 'fileexcludemimetype' => File\ExcludeMimeType::class, + 'fileExcludeMimeType' => File\ExcludeMimeType::class, + 'FileExcludeMimeType' => File\ExcludeMimeType::class, + 'fileexists' => File\Exists::class, + 'fileExists' => File\Exists::class, + 'FileExists' => File\Exists::class, + 'fileextension' => File\Extension::class, + 'fileExtension' => File\Extension::class, + 'FileExtension' => File\Extension::class, + 'filefilessize' => File\FilesSize::class, + 'fileFilesSize' => File\FilesSize::class, + 'FileFilesSize' => File\FilesSize::class, + 'filehash' => File\Hash::class, + 'fileHash' => File\Hash::class, + 'FileHash' => File\Hash::class, + 'fileimagesize' => File\ImageSize::class, + 'fileImageSize' => File\ImageSize::class, + 'FileImageSize' => File\ImageSize::class, + 'fileiscompressed' => File\IsCompressed::class, + 'fileIsCompressed' => File\IsCompressed::class, + 'FileIsCompressed' => File\IsCompressed::class, + 'fileisimage' => File\IsImage::class, + 'fileIsImage' => File\IsImage::class, + 'FileIsImage' => File\IsImage::class, + 'filemd5' => File\Md5::class, + 'fileMd5' => File\Md5::class, + 'FileMd5' => File\Md5::class, + 'filemimetype' => File\MimeType::class, + 'fileMimeType' => File\MimeType::class, + 'FileMimeType' => File\MimeType::class, + 'filenotexists' => File\NotExists::class, + 'fileNotExists' => File\NotExists::class, + 'FileNotExists' => File\NotExists::class, + 'filesha1' => File\Sha1::class, + 'fileSha1' => File\Sha1::class, + 'FileSha1' => File\Sha1::class, + 'filesize' => File\Size::class, + 'fileSize' => File\Size::class, + 'FileSize' => File\Size::class, + 'fileupload' => File\Upload::class, + 'fileUpload' => File\Upload::class, + 'FileUpload' => File\Upload::class, + 'fileuploadfile' => File\UploadFile::class, + 'fileUploadFile' => File\UploadFile::class, + 'FileUploadFile' => File\UploadFile::class, + 'filewordcount' => File\WordCount::class, + 'fileWordCount' => File\WordCount::class, + 'FileWordCount' => File\WordCount::class, + 'float' => I18nValidator\IsFloat::class, + 'Float' => I18nValidator\IsFloat::class, + 'gpspoint' => GpsPoint::class, + 'gpsPoint' => GpsPoint::class, + 'GpsPoint' => GpsPoint::class, + 'greaterthan' => GreaterThan::class, + 'greaterThan' => GreaterThan::class, + 'GreaterThan' => GreaterThan::class, + 'hex' => Hex::class, + 'Hex' => Hex::class, + 'hostname' => Hostname::class, + 'Hostname' => Hostname::class, + 'iban' => Iban::class, + 'Iban' => Iban::class, + 'identical' => Identical::class, + 'Identical' => Identical::class, + 'inarray' => InArray::class, + 'inArray' => InArray::class, + 'InArray' => InArray::class, + 'int' => I18nValidator\IsInt::class, + 'Int' => I18nValidator\IsInt::class, + 'ip' => Ip::class, + 'Ip' => Ip::class, + 'IsArray' => IsArray::class, + 'isbn' => Isbn::class, + 'Isbn' => Isbn::class, + 'isCountable' => IsCountable::class, + 'IsCountable' => IsCountable::class, + 'iscountable' => IsCountable::class, + 'isfloat' => I18nValidator\IsFloat::class, + 'isFloat' => I18nValidator\IsFloat::class, + 'IsFloat' => I18nValidator\IsFloat::class, + 'isinstanceof' => IsInstanceOf::class, + 'isInstanceOf' => IsInstanceOf::class, + 'IsInstanceOf' => IsInstanceOf::class, + 'isint' => I18nValidator\IsInt::class, + 'isInt' => I18nValidator\IsInt::class, + 'IsInt' => I18nValidator\IsInt::class, + 'lessthan' => LessThan::class, + 'lessThan' => LessThan::class, + 'LessThan' => LessThan::class, + 'notempty' => NotEmpty::class, + 'notEmpty' => NotEmpty::class, + 'NotEmpty' => NotEmpty::class, + 'phonenumber' => I18nValidator\PhoneNumber::class, + 'phoneNumber' => I18nValidator\PhoneNumber::class, + 'PhoneNumber' => I18nValidator\PhoneNumber::class, + 'postcode' => I18nValidator\PostCode::class, + 'postCode' => I18nValidator\PostCode::class, + 'PostCode' => I18nValidator\PostCode::class, + 'regex' => Regex::class, + 'Regex' => Regex::class, + 'sitemapchangefreq' => Sitemap\Changefreq::class, + 'sitemapChangefreq' => Sitemap\Changefreq::class, + 'SitemapChangefreq' => Sitemap\Changefreq::class, + 'sitemaplastmod' => Sitemap\Lastmod::class, + 'sitemapLastmod' => Sitemap\Lastmod::class, + 'SitemapLastmod' => Sitemap\Lastmod::class, + 'sitemaploc' => Sitemap\Loc::class, + 'sitemapLoc' => Sitemap\Loc::class, + 'SitemapLoc' => Sitemap\Loc::class, + 'sitemappriority' => Sitemap\Priority::class, + 'sitemapPriority' => Sitemap\Priority::class, + 'SitemapPriority' => Sitemap\Priority::class, + 'stringlength' => StringLength::class, + 'stringLength' => StringLength::class, + 'StringLength' => StringLength::class, + 'step' => Step::class, + 'Step' => Step::class, + 'timezone' => Timezone::class, + 'Timezone' => Timezone::class, + 'uri' => Uri::class, + 'Uri' => Uri::class, + 'uuid' => Uuid::class, + 'Uuid' => Uuid::class, + + // Legacy Zend Framework aliases + 'Zend\I18nValidator\Alnum' => I18nValidator\Alnum::class, + 'Zend\I18n\Validator\Alpha' => I18nValidator\Alpha::class, + 'Zend\Validator\Barcode' => Barcode::class, + 'Zend\Validator\Between' => Between::class, + 'Zend\Validator\Bitwise' => Bitwise::class, + 'Zend\Validator\Callback' => Callback::class, + 'Zend\Validator\CreditCard' => CreditCard::class, + 'Zend\Validator\Csrf' => Csrf::class, + 'Zend\Validator\DateStep' => DateStep::class, + 'Zend\Validator\Date' => Date::class, + 'Zend\I18n\Validator\DateTime' => I18nValidator\DateTime::class, + 'Zend\Validator\Db\NoRecordExists' => Db\NoRecordExists::class, + 'Zend\Validator\Db\RecordExists' => Db\RecordExists::class, + 'Zend\Validator\Digits' => Digits::class, + 'Zend\Validator\EmailAddress' => EmailAddress::class, + 'Zend\Validator\Explode' => Explode::class, + 'Zend\Validator\File\Count' => File\Count::class, + 'Zend\Validator\File\Crc32' => File\Crc32::class, + 'Zend\Validator\File\ExcludeExtension' => File\ExcludeExtension::class, + 'Zend\Validator\File\ExcludeMimeType' => File\ExcludeMimeType::class, + 'Zend\Validator\File\Exists' => File\Exists::class, + 'Zend\Validator\File\Extension' => File\Extension::class, + 'Zend\Validator\File\FilesSize' => File\FilesSize::class, + 'Zend\Validator\File\Hash' => File\Hash::class, + 'Zend\Validator\File\ImageSize' => File\ImageSize::class, + 'Zend\Validator\File\IsCompressed' => File\IsCompressed::class, + 'Zend\Validator\File\IsImage' => File\IsImage::class, + 'Zend\Validator\File\Md5' => File\Md5::class, + 'Zend\Validator\File\MimeType' => File\MimeType::class, + 'Zend\Validator\File\NotExists' => File\NotExists::class, + 'Zend\Validator\File\Sha1' => File\Sha1::class, + 'Zend\Validator\File\Size' => File\Size::class, + 'Zend\Validator\File\Upload' => File\Upload::class, + 'Zend\Validator\File\UploadFile' => File\UploadFile::class, + 'Zend\Validator\File\WordCount' => File\WordCount::class, + 'Zend\I18n\Validator\IsFloatIsFloat' => I18nValidator\IsFloat::class, + 'Zend\Validator\GpsPoint' => GpsPoint::class, + 'Zend\Validator\GreaterThan' => GreaterThan::class, + 'Zend\Validator\Hex' => Hex::class, + 'Zend\Validator\Hostname' => Hostname::class, + 'Zend\Validator\Iban' => Iban::class, + 'Zend\Validator\Identical' => Identical::class, + 'Zend\Validator\InArray' => InArray::class, + 'Zend\I18n\Validator\IsInt' => I18nValidator\IsInt::class, + 'Zend\Validator\Ip' => Ip::class, + 'Zend\Validator\Isbn' => Isbn::class, + 'Zend\Validator\IsInstanceOf' => IsInstanceOf::class, + 'Zend\Validator\LessThan' => LessThan::class, + 'Zend\Validator\NotEmpty' => NotEmpty::class, + 'Zend\I18n\Validator\PhoneNumber' => I18nValidator\PhoneNumber::class, + 'Zend\I18n\Validator\PostCode' => I18nValidator\PostCode::class, + 'Zend\Validator\Regex' => Regex::class, + 'Zend\Validator\Sitemap\Changefreq' => Sitemap\Changefreq::class, + 'Zend\Validator\Sitemap\Lastmod' => Sitemap\Lastmod::class, + 'Zend\Validator\Sitemap\Loc' => Sitemap\Loc::class, + 'Zend\Validator\Sitemap\Priority' => Sitemap\Priority::class, + 'Zend\Validator\StringLength' => StringLength::class, + 'Zend\Validator\Step' => Step::class, + 'Zend\Validator\Timezone' => Timezone::class, + 'Zend\Validator\Uri' => Uri::class, + 'Zend\Validator\Uuid' => Uuid::class, + + // v2 normalized FQCNs + 'zendvalidatorbarcode' => Barcode::class, + 'zendvalidatorbetween' => Between::class, + 'zendvalidatorbitwise' => Bitwise::class, + 'zendvalidatorcallback' => Callback::class, + 'zendvalidatorcreditcard' => CreditCard::class, + 'zendvalidatorcsrf' => Csrf::class, + 'zendvalidatordatestep' => DateStep::class, + 'zendvalidatordate' => Date::class, + 'zendvalidatordbnorecordexists' => Db\NoRecordExists::class, + 'zendvalidatordbrecordexists' => Db\RecordExists::class, + 'zendvalidatordigits' => Digits::class, + 'zendvalidatoremailaddress' => EmailAddress::class, + 'zendvalidatorexplode' => Explode::class, + 'zendvalidatorfilecount' => File\Count::class, + 'zendvalidatorfilecrc32' => File\Crc32::class, + 'zendvalidatorfileexcludeextension' => File\ExcludeExtension::class, + 'zendvalidatorfileexcludemimetype' => File\ExcludeMimeType::class, + 'zendvalidatorfileexists' => File\Exists::class, + 'zendvalidatorfileextension' => File\Extension::class, + 'zendvalidatorfilefilessize' => File\FilesSize::class, + 'zendvalidatorfilehash' => File\Hash::class, + 'zendvalidatorfileimagesize' => File\ImageSize::class, + 'zendvalidatorfileiscompressed' => File\IsCompressed::class, + 'zendvalidatorfileisimage' => File\IsImage::class, + 'zendvalidatorfilemd5' => File\Md5::class, + 'zendvalidatorfilemimetype' => File\MimeType::class, + 'zendvalidatorfilenotexists' => File\NotExists::class, + 'zendvalidatorfilesha1' => File\Sha1::class, + 'zendvalidatorfilesize' => File\Size::class, + 'zendvalidatorfileupload' => File\Upload::class, + 'zendvalidatorfileuploadfile' => File\UploadFile::class, + 'zendvalidatorfilewordcount' => File\WordCount::class, + 'zendvalidatorgpspoint' => GpsPoint::class, + 'zendvalidatorgreaterthan' => GreaterThan::class, + 'zendvalidatorhex' => Hex::class, + 'zendvalidatorhostname' => Hostname::class, + 'zendi18nvalidatoralnum' => I18nValidator\Alnum::class, + 'zendi18nvalidatoralpha' => I18nValidator\Alpha::class, + 'zendi18nvalidatordatetime' => I18nValidator\DateTime::class, + 'zendi18nvalidatorisfloat' => I18nValidator\IsFloat::class, + 'zendi18nvalidatorisint' => I18nValidator\IsInt::class, + 'zendi18nvalidatorphonenumber' => I18nValidator\PhoneNumber::class, + 'zendi18nvalidatorpostcode' => I18nValidator\PostCode::class, + 'zendvalidatoriban' => Iban::class, + 'zendvalidatoridentical' => Identical::class, + 'zendvalidatorinarray' => InArray::class, + 'zendvalidatorip' => Ip::class, + 'zendvalidatorisbn' => Isbn::class, + 'zendvalidatorisinstanceof' => IsInstanceOf::class, + 'zendvalidatorlessthan' => LessThan::class, + 'zendvalidatornotempty' => NotEmpty::class, + 'zendvalidatorregex' => Regex::class, + 'zendvalidatorsitemapchangefreq' => Sitemap\Changefreq::class, + 'zendvalidatorsitemaplastmod' => Sitemap\Lastmod::class, + 'zendvalidatorsitemaploc' => Sitemap\Loc::class, + 'zendvalidatorsitemappriority' => Sitemap\Priority::class, + 'zendvalidatorstringlength' => StringLength::class, + 'zendvalidatorstep' => Step::class, + 'zendvalidatortimezone' => Timezone::class, + 'zendvalidatoruri' => Uri::class, + 'zendvalidatoruuid' => Uuid::class, + ]; + + /** + * Default set of factories + * + * @inheritDoc + */ + protected $factories = [ + I18nValidator\Alnum::class => InvokableFactory::class, + I18nValidator\Alpha::class => InvokableFactory::class, + Barcode::class => InvokableFactory::class, + Between::class => InvokableFactory::class, + Bitwise::class => InvokableFactory::class, + BusinessIdentifierCode::class => InvokableFactory::class, + Callback::class => InvokableFactory::class, + CreditCard::class => InvokableFactory::class, + Csrf::class => InvokableFactory::class, + DateStep::class => InvokableFactory::class, + Date::class => InvokableFactory::class, + DateComparison::class => InvokableFactory::class, + I18nValidator\DateTime::class => InvokableFactory::class, + Db\NoRecordExists::class => InvokableFactory::class, + Db\RecordExists::class => InvokableFactory::class, + Digits::class => InvokableFactory::class, + EmailAddress::class => InvokableFactory::class, + Explode::class => InvokableFactory::class, + File\Count::class => InvokableFactory::class, + File\Crc32::class => InvokableFactory::class, + File\ExcludeExtension::class => InvokableFactory::class, + File\ExcludeMimeType::class => InvokableFactory::class, + File\Exists::class => InvokableFactory::class, + File\Extension::class => InvokableFactory::class, + File\FilesSize::class => InvokableFactory::class, + File\Hash::class => InvokableFactory::class, + File\ImageSize::class => InvokableFactory::class, + File\IsCompressed::class => InvokableFactory::class, + File\IsImage::class => InvokableFactory::class, + File\Md5::class => InvokableFactory::class, + File\MimeType::class => InvokableFactory::class, + File\NotExists::class => InvokableFactory::class, + File\Sha1::class => InvokableFactory::class, + File\Size::class => InvokableFactory::class, + File\Upload::class => InvokableFactory::class, + File\UploadFile::class => InvokableFactory::class, + File\WordCount::class => InvokableFactory::class, + I18nValidator\IsFloat::class => InvokableFactory::class, + GpsPoint::class => InvokableFactory::class, + GreaterThan::class => InvokableFactory::class, + Hex::class => InvokableFactory::class, + Hostname::class => InvokableFactory::class, + HostWithPublicIPv4Address::class => InvokableFactory::class, + Iban::class => InvokableFactory::class, + Identical::class => InvokableFactory::class, + InArray::class => InvokableFactory::class, + I18nValidator\IsInt::class => InvokableFactory::class, + Ip::class => InvokableFactory::class, + IsArray::class => InvokableFactory::class, + Isbn::class => InvokableFactory::class, + IsCountable::class => InvokableFactory::class, + IsInstanceOf::class => InvokableFactory::class, + IsJsonString::class => InvokableFactory::class, + LessThan::class => InvokableFactory::class, + NotEmpty::class => InvokableFactory::class, + NumberComparison::class => InvokableFactory::class, + I18nValidator\PhoneNumber::class => InvokableFactory::class, + I18nValidator\PostCode::class => InvokableFactory::class, + Regex::class => InvokableFactory::class, + Sitemap\Changefreq::class => InvokableFactory::class, + Sitemap\Lastmod::class => InvokableFactory::class, + Sitemap\Loc::class => InvokableFactory::class, + Sitemap\Priority::class => InvokableFactory::class, + StringLength::class => InvokableFactory::class, + Step::class => InvokableFactory::class, + Timezone::class => InvokableFactory::class, + Uri::class => InvokableFactory::class, + Uuid::class => InvokableFactory::class, + + // v2 canonical FQCNs + 'laminasvalidatorbarcodecode25interleaved' => InvokableFactory::class, + 'laminasvalidatorbarcodecode25' => InvokableFactory::class, + 'laminasvalidatorbarcodecode39ext' => InvokableFactory::class, + 'laminasvalidatorbarcodecode39' => InvokableFactory::class, + 'laminasvalidatorbarcodecode93ext' => InvokableFactory::class, + 'laminasvalidatorbarcodecode93' => InvokableFactory::class, + 'laminasvalidatorbarcodeean12' => InvokableFactory::class, + 'laminasvalidatorbarcodeean13' => InvokableFactory::class, + 'laminasvalidatorbarcodeean14' => InvokableFactory::class, + 'laminasvalidatorbarcodeean18' => InvokableFactory::class, + 'laminasvalidatorbarcodeean2' => InvokableFactory::class, + 'laminasvalidatorbarcodeean5' => InvokableFactory::class, + 'laminasvalidatorbarcodeean8' => InvokableFactory::class, + 'laminasvalidatorbarcodegtin12' => InvokableFactory::class, + 'laminasvalidatorbarcodegtin13' => InvokableFactory::class, + 'laminasvalidatorbarcodegtin14' => InvokableFactory::class, + 'laminasvalidatorbarcodeidentcode' => InvokableFactory::class, + 'laminasvalidatorbarcodeintelligentmail' => InvokableFactory::class, + 'laminasvalidatorbarcodeissn' => InvokableFactory::class, + 'laminasvalidatorbarcodeitf14' => InvokableFactory::class, + 'laminasvalidatorbarcodeleitcode' => InvokableFactory::class, + 'laminasvalidatorbarcodeplanet' => InvokableFactory::class, + 'laminasvalidatorbarcodepostnet' => InvokableFactory::class, + 'laminasvalidatorbarcoderoyalmail' => InvokableFactory::class, + 'laminasvalidatorbarcodesscc' => InvokableFactory::class, + 'laminasvalidatorbarcodeupca' => InvokableFactory::class, + 'laminasvalidatorbarcodeupce' => InvokableFactory::class, + 'laminasvalidatorbarcode' => InvokableFactory::class, + 'laminasvalidatorbetween' => InvokableFactory::class, + 'laminasvalidatorbitwise' => InvokableFactory::class, + 'laminasvalidatorcallback' => InvokableFactory::class, + 'laminasvalidatorcreditcard' => InvokableFactory::class, + 'laminasvalidatorcsrf' => InvokableFactory::class, + 'laminasvalidatordatestep' => InvokableFactory::class, + 'laminasvalidatordate' => InvokableFactory::class, + 'laminasvalidatordbnorecordexists' => InvokableFactory::class, + 'laminasvalidatordbrecordexists' => InvokableFactory::class, + 'laminasvalidatordigits' => InvokableFactory::class, + 'laminasvalidatoremailaddress' => InvokableFactory::class, + 'laminasvalidatorexplode' => InvokableFactory::class, + 'laminasvalidatorfilecount' => InvokableFactory::class, + 'laminasvalidatorfilecrc32' => InvokableFactory::class, + 'laminasvalidatorfileexcludeextension' => InvokableFactory::class, + 'laminasvalidatorfileexcludemimetype' => InvokableFactory::class, + 'laminasvalidatorfileexists' => InvokableFactory::class, + 'laminasvalidatorfileextension' => InvokableFactory::class, + 'laminasvalidatorfilefilessize' => InvokableFactory::class, + 'laminasvalidatorfilehash' => InvokableFactory::class, + 'laminasvalidatorfileimagesize' => InvokableFactory::class, + 'laminasvalidatorfileiscompressed' => InvokableFactory::class, + 'laminasvalidatorfileisimage' => InvokableFactory::class, + 'laminasvalidatorfilemd5' => InvokableFactory::class, + 'laminasvalidatorfilemimetype' => InvokableFactory::class, + 'laminasvalidatorfilenotexists' => InvokableFactory::class, + 'laminasvalidatorfilesha1' => InvokableFactory::class, + 'laminasvalidatorfilesize' => InvokableFactory::class, + 'laminasvalidatorfileupload' => InvokableFactory::class, + 'laminasvalidatorfileuploadfile' => InvokableFactory::class, + 'laminasvalidatorfilewordcount' => InvokableFactory::class, + 'laminasvalidatorgpspoint' => InvokableFactory::class, + 'laminasvalidatorgreaterthan' => InvokableFactory::class, + 'laminasvalidatorhex' => InvokableFactory::class, + 'laminasvalidatorhostname' => InvokableFactory::class, + 'laminasi18nvalidatoralnum' => InvokableFactory::class, + 'laminasi18nvalidatoralpha' => InvokableFactory::class, + 'laminasi18nvalidatordatetime' => InvokableFactory::class, + 'laminasi18nvalidatorisfloat' => InvokableFactory::class, + 'laminasi18nvalidatorisint' => InvokableFactory::class, + 'laminasi18nvalidatorphonenumber' => InvokableFactory::class, + 'laminasi18nvalidatorpostcode' => InvokableFactory::class, + 'laminasvalidatoriban' => InvokableFactory::class, + 'laminasvalidatoridentical' => InvokableFactory::class, + 'laminasvalidatorinarray' => InvokableFactory::class, + 'laminasvalidatorip' => InvokableFactory::class, + 'laminasvalidatorisbn' => InvokableFactory::class, + 'laminasvalidatoriscountable' => InvokableFactory::class, + 'laminasvalidatorisinstanceof' => InvokableFactory::class, + 'laminasvalidatorlessthan' => InvokableFactory::class, + 'laminasvalidatornotempty' => InvokableFactory::class, + 'laminasvalidatorregex' => InvokableFactory::class, + 'laminasvalidatorsitemapchangefreq' => InvokableFactory::class, + 'laminasvalidatorsitemaplastmod' => InvokableFactory::class, + 'laminasvalidatorsitemaploc' => InvokableFactory::class, + 'laminasvalidatorsitemappriority' => InvokableFactory::class, + 'laminasvalidatorstringlength' => InvokableFactory::class, + 'laminasvalidatorstep' => InvokableFactory::class, + 'laminasvalidatortimezone' => InvokableFactory::class, + 'laminasvalidatoruri' => InvokableFactory::class, + 'laminasvalidatoruuid' => InvokableFactory::class, + ]; + + /** + * Whether or not to share by default; default to false (v2) + * + * @var bool + */ + protected $shareByDefault = false; + + /** + * Whether or not to share by default; default to false (v3) + * + * @var bool + */ + protected $sharedByDefault = false; + + /** + * Default instance type + * + * @inheritDoc + */ + protected $instanceOf = ValidatorInterface::class; + + /** + * Constructor + * + * After invoking parent constructor, add an initializer to inject the + * attached translator, if any, to the currently requested helper. + * + * {@inheritDoc} + * + * @param ServiceManagerConfiguration $v3config + */ + public function __construct($configOrContainerInstance = null, array $v3config = []) + { + parent::__construct($configOrContainerInstance, $v3config); + + $this->addInitializer([$this, 'injectTranslator']); + $this->addInitializer([$this, 'injectValidatorPluginManager']); + } + + /** + * @param mixed $instance + * @psalm-assert ValidatorInterface $instance + */ + public function validate($instance) + { + if (! $instance instanceof $this->instanceOf) { + throw new InvalidServiceException(sprintf( + '%s expects only to create instances of %s; %s is invalid', + static::class, + (string) $this->instanceOf, + get_debug_type($instance) + )); + } + } + + /** + * For v2 compatibility: validate plugin instance. + * + * Proxies to `validate()`. + * + * @return void + * @throws Exception\RuntimeException + */ + public function validatePlugin(mixed $plugin) + { + try { + $this->validate($plugin); + } catch (InvalidServiceException $e) { + throw new Exception\RuntimeException(sprintf( + 'Plugin of type %s is invalid; must implement %s', + get_debug_type($plugin), + ValidatorInterface::class + ), $e->getCode(), $e); + } + } + + /** + * Inject a validator instance with the registered translator + * + * @param ContainerInterface|object $first + * @param ContainerInterface|object $second + * @return void + */ + public function injectTranslator($first, $second) + { + if ($first instanceof ContainerInterface) { + $container = $first; + $validator = $second; + } else { + $container = $second; + $validator = $first; + } + + if (! $validator instanceof Translator\TranslatorAwareInterface) { + return; + } + + // V2 means we pull it from the parent container + if ($container === $this && method_exists($container, 'getServiceLocator') && $container->getServiceLocator()) { + $container = $container->getServiceLocator(); + } + + if (! $container instanceof ContainerInterface) { + return; + } + + if ($container->has('MvcTranslator')) { + $validator->setTranslator($container->get('MvcTranslator')); + + return; + } + + if ($container->has(TranslatorInterface::class)) { + $validator->setTranslator($container->get(Translator\TranslatorInterface::class)); + } + } + + /** + * Inject a validator plugin manager + * + * @param ContainerInterface|object $first + * @param ContainerInterface|object $second + * @return void + */ + public function injectValidatorPluginManager($first, $second) + { + if ($first instanceof ContainerInterface) { + $validator = $second; + } else { + $validator = $first; + } + if ($validator instanceof ValidatorPluginManagerAwareInterface) { + $validator->setValidatorPluginManager($this); + } + } +} diff --git a/vendor/laminas/laminas-validator/src/ValidatorPluginManagerAwareInterface.php b/vendor/laminas/laminas-validator/src/ValidatorPluginManagerAwareInterface.php new file mode 100644 index 00000000..d30cc7e7 --- /dev/null +++ b/vendor/laminas/laminas-validator/src/ValidatorPluginManagerAwareInterface.php @@ -0,0 +1,18 @@ +has('ServiceListener')) { + return $pluginManager; + } + + // If we do not have a config service, nothing more to do + if (! $container->has('config')) { + return $pluginManager; + } + + $config = $container->get('config'); + + // If we do not have validators configuration, nothing more to do + if (! isset($config['validators']) || ! is_array($config['validators'])) { + return $pluginManager; + } + + // Wire service configuration for validators + (new Config($config['validators']))->configureServiceManager($pluginManager); + + return $pluginManager; + } + + /** + * {@inheritDoc} + * + * @param string|null $name + * @param string|null $requestedName + * @return ValidatorPluginManager + */ + public function createService(ServiceLocatorInterface $container, $name = null, $requestedName = null) + { + return $this($container, $requestedName ?? ValidatorPluginManager::class, $this->creationOptions); + } + + /** + * laminas-servicemanager v2 support for invocation options. + * + * @param ServiceManagerConfiguration $options + * @return void + */ + public function setCreationOptions(array $options) + { + $this->creationOptions = $options; + } +} diff --git a/vendor/laminas/laminas-validator/src/ValidatorProviderInterface.php b/vendor/laminas/laminas-validator/src/ValidatorProviderInterface.php new file mode 100644 index 00000000..4850bb2e --- /dev/null +++ b/vendor/laminas/laminas-validator/src/ValidatorProviderInterface.php @@ -0,0 +1,26 @@ +=7.4.0" + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + } +} diff --git a/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/psr/container/src/ContainerExceptionInterface.php new file mode 100644 index 00000000..0f213f2f --- /dev/null +++ b/vendor/psr/container/src/ContainerExceptionInterface.php @@ -0,0 +1,12 @@ + `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. +> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. + diff --git a/vendor/psr/http-message/docs/PSR7-Usage.md b/vendor/psr/http-message/docs/PSR7-Usage.md new file mode 100644 index 00000000..b6d048a3 --- /dev/null +++ b/vendor/psr/http-message/docs/PSR7-Usage.md @@ -0,0 +1,159 @@ +### PSR-7 Usage + +All PSR-7 applications comply with these interfaces +They were created to establish a standard between middleware implementations. + +> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. +> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. + + +The following examples will illustrate how basic operations are done in PSR-7. + +##### Examples + + +For this examples to work (at least) a PSR-7 implementation package is required. (eg: zendframework/zend-diactoros, guzzlehttp/psr7, slim/slim, etc) +All PSR-7 implementations should have the same behaviour. + +The following will be assumed: +`$request` is an object of `Psr\Http\Message\RequestInterface` and + +`$response` is an object implementing `Psr\Http\Message\RequestInterface` + + +### Working with HTTP Headers + +#### Adding headers to response: + +```php +$response->withHeader('My-Custom-Header', 'My Custom Message'); +``` + +#### Appending values to headers + +```php +$response->withAddedHeader('My-Custom-Header', 'The second message'); +``` + +#### Checking if header exists: + +```php +$request->hasHeader('My-Custom-Header'); // will return false +$response->hasHeader('My-Custom-Header'); // will return true +``` + +> Note: My-Custom-Header was only added in the Response + +#### Getting comma-separated values from a header (also applies to request) + +```php +// getting value from request headers +$request->getHeaderLine('Content-Type'); // will return: "text/html; charset=UTF-8" +// getting value from response headers +$response->getHeaderLine('My-Custom-Header'); // will return: "My Custom Message; The second message" +``` + +#### Getting array of value from a header (also applies to request) +```php +// getting value from request headers +$request->getHeader('Content-Type'); // will return: ["text/html", "charset=UTF-8"] +// getting value from response headers +$response->getHeader('My-Custom-Header'); // will return: ["My Custom Message", "The second message"] +``` + +#### Removing headers from HTTP Messages +```php +// removing a header from Request, removing deprecated "Content-MD5" header +$request->withoutHeader('Content-MD5'); + +// removing a header from Response +// effect: the browser won't know the size of the stream +// the browser will download the stream till it ends +$response->withoutHeader('Content-Length'); +``` + +### Working with HTTP Message Body + +When working with the PSR-7 there are two methods of implementation: +#### 1. Getting the body separately + +> This method makes the body handling easier to understand and is useful when repeatedly calling body methods. (You only call `getBody()` once). Using this method mistakes like `$response->write()` are also prevented. + +```php +$body = $response->getBody(); +// operations on body, eg. read, write, seek +// ... +// replacing the old body +$response->withBody($body); +// this last statement is optional as we working with objects +// in this case the "new" body is same with the "old" one +// the $body variable has the same value as the one in $request, only the reference is passed +``` + +#### 2. Working directly on response + +> This method is useful when only performing few operations as the `$request->getBody()` statement fragment is required + +```php +$response->getBody()->write('hello'); +``` + +### Getting the body contents + +The following snippet gets the contents of a stream contents. +> Note: Streams must be rewinded, if content was written into streams, it will be ignored when calling `getContents()` because the stream pointer is set to the last character, which is `\0` - meaning end of stream. +```php +$body = $response->getBody(); +$body->rewind(); // or $body->seek(0); +$bodyText = $body->getContents(); +``` +> Note: If `$body->seek(1)` is called before `$body->getContents()`, the first character will be ommited as the starting pointer is set to `1`, not `0`. This is why using `$body->rewind()` is recommended. + +### Append to body + +```php +$response->getBody()->write('Hello'); // writing directly +$body = $request->getBody(); // which is a `StreamInterface` +$body->write('xxxxx'); +``` + +### Prepend to body +Prepending is different when it comes to streams. The content must be copied before writing the content to be prepended. +The following example will explain the behaviour of streams. + +```php +// assuming our response is initially empty +$body = $repsonse->getBody(); +// writing the string "abcd" +$body->write('abcd'); + +// seeking to start of stream +$body->seek(0); +// writing 'ef' +$body->write('ef'); // at this point the stream contains "efcd" +``` + +#### Prepending by rewriting separately + +```php +// assuming our response body stream only contains: "abcd" +$body = $response->getBody(); +$body->rewind(); +$contents = $body->getContents(); // abcd +// seeking the stream to beginning +$body->rewind(); +$body->write('ef'); // stream contains "efcd" +$body->write($contents); // stream contains "efabcd" +``` + +> Note: `getContents()` seeks the stream while reading it, therefore if the second `rewind()` method call was not present the stream would have resulted in `abcdefabcd` because the `write()` method appends to stream if not preceeded by `rewind()` or `seek(0)`. + +#### Prepending by using contents as a string +```php +$body = $response->getBody(); +$body->rewind(); +$contents = $body->getContents(); // efabcd +$contents = 'ef'.$contents; +$body->rewind(); +$body->write($contents); +``` diff --git a/vendor/psr/http-message/src/MessageInterface.php b/vendor/psr/http-message/src/MessageInterface.php new file mode 100644 index 00000000..a83c9851 --- /dev/null +++ b/vendor/psr/http-message/src/MessageInterface.php @@ -0,0 +1,187 @@ +getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * // Emit headers iteratively: + * foreach ($message->getHeaders() as $name => $values) { + * foreach ($values as $value) { + * header(sprintf('%s: %s', $name, $value), false); + * } + * } + * + * While header names are not case-sensitive, getHeaders() will preserve the + * exact case in which headers were originally specified. + * + * @return string[][] Returns an associative array of the message's headers. Each + * key MUST be a header name, and each value MUST be an array of strings + * for that header. + */ + public function getHeaders(): array; + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $name Case-insensitive header field name. + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader(string $name): bool; + + /** + * Retrieves a message header value by the given case-insensitive name. + * + * This method returns an array of all the header values of the given + * case-insensitive header name. + * + * If the header does not appear in the message, this method MUST return an + * empty array. + * + * @param string $name Case-insensitive header field name. + * @return string[] An array of string values as provided for the given + * header. If the header does not appear in the message, this method MUST + * return an empty array. + */ + public function getHeader(string $name): array; + + /** + * Retrieves a comma-separated string of the values for a single header. + * + * This method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. + * + * NOTE: Not all header values may be appropriately represented using + * comma concatenation. For such headers, use getHeader() instead + * and supply your own delimiter when concatenating. + * + * If the header does not appear in the message, this method MUST return + * an empty string. + * + * @param string $name Case-insensitive header field name. + * @return string A string of values as provided for the given header + * concatenated together using a comma. If the header does not appear in + * the message, this method MUST return an empty string. + */ + public function getHeaderLine(string $name): string; + + /** + * Return an instance with the provided value replacing the specified header. + * + * While header names are case-insensitive, the casing of the header will + * be preserved by this function, and returned from getHeaders(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new and/or updated header and value. + * + * @param string $name Case-insensitive header field name. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withHeader(string $name, $value): MessageInterface; + + /** + * Return an instance with the specified header appended with the given value. + * + * Existing values for the specified header will be maintained. The new + * value(s) will be appended to the existing list. If the header did not + * exist previously, it will be added. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new header and/or value. + * + * @param string $name Case-insensitive header field name to add. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withAddedHeader(string $name, $value): MessageInterface; + + /** + * Return an instance without the specified header. + * + * Header resolution MUST be done without case-sensitivity. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the named header. + * + * @param string $name Case-insensitive header field name to remove. + * @return static + */ + public function withoutHeader(string $name): MessageInterface; + + /** + * Gets the body of the message. + * + * @return StreamInterface Returns the body as a stream. + */ + public function getBody(): StreamInterface; + + /** + * Return an instance with the specified message body. + * + * The body MUST be a StreamInterface object. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * new body stream. + * + * @param StreamInterface $body Body. + * @return static + * @throws \InvalidArgumentException When the body is not valid. + */ + public function withBody(StreamInterface $body): MessageInterface; +} diff --git a/vendor/psr/http-message/src/RequestInterface.php b/vendor/psr/http-message/src/RequestInterface.php new file mode 100644 index 00000000..33f85e55 --- /dev/null +++ b/vendor/psr/http-message/src/RequestInterface.php @@ -0,0 +1,130 @@ +getQuery()` + * or from the `QUERY_STRING` server param. + * + * @return array + */ + public function getQueryParams(): array; + + /** + * Return an instance with the specified query string arguments. + * + * These values SHOULD remain immutable over the course of the incoming + * request. They MAY be injected during instantiation, such as from PHP's + * $_GET superglobal, or MAY be derived from some other value such as the + * URI. In cases where the arguments are parsed from the URI, the data + * MUST be compatible with what PHP's parse_str() would return for + * purposes of how duplicate query parameters are handled, and how nested + * sets are handled. + * + * Setting query string arguments MUST NOT change the URI stored by the + * request, nor the values in the server params. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated query string arguments. + * + * @param array $query Array of query string arguments, typically from + * $_GET. + * @return static + */ + public function withQueryParams(array $query): ServerRequestInterface; + + /** + * Retrieve normalized file upload data. + * + * This method returns upload metadata in a normalized tree, with each leaf + * an instance of Psr\Http\Message\UploadedFileInterface. + * + * These values MAY be prepared from $_FILES or the message body during + * instantiation, or MAY be injected via withUploadedFiles(). + * + * @return array An array tree of UploadedFileInterface instances; an empty + * array MUST be returned if no data is present. + */ + public function getUploadedFiles(): array; + + /** + * Create a new instance with the specified uploaded files. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static + * @throws \InvalidArgumentException if an invalid structure is provided. + */ + public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface; + + /** + * Retrieve any parameters provided in the request body. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, this method MUST + * return the contents of $_POST. + * + * Otherwise, this method may return any results of deserializing + * the request body content; as parsing returns structured content, the + * potential types MUST be arrays or objects only. A null value indicates + * the absence of body content. + * + * @return null|array|object The deserialized body parameters, if any. + * These will typically be an array or object. + */ + public function getParsedBody(); + + /** + * Return an instance with the specified body parameters. + * + * These MAY be injected during instantiation. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, use this method + * ONLY to inject the contents of $_POST. + * + * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of + * deserializing the request body content. Deserialization/parsing returns + * structured data, and, as such, this method ONLY accepts arrays or objects, + * or a null value if nothing was available to parse. + * + * As an example, if content negotiation determines that the request data + * is a JSON payload, this method could be used to create a request + * instance with the deserialized parameters. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param null|array|object $data The deserialized body data. This will + * typically be in an array or object. + * @return static + * @throws \InvalidArgumentException if an unsupported argument type is + * provided. + */ + public function withParsedBody($data): ServerRequestInterface; + + /** + * Retrieve attributes derived from the request. + * + * The request "attributes" may be used to allow injection of any + * parameters derived from the request: e.g., the results of path + * match operations; the results of decrypting cookies; the results of + * deserializing non-form-encoded message bodies; etc. Attributes + * will be application and request specific, and CAN be mutable. + * + * @return array Attributes derived from the request. + */ + public function getAttributes(): array; + + /** + * Retrieve a single derived request attribute. + * + * Retrieves a single derived request attribute as described in + * getAttributes(). If the attribute has not been previously set, returns + * the default value as provided. + * + * This method obviates the need for a hasAttribute() method, as it allows + * specifying a default value to return if the attribute is not found. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $default Default value to return if the attribute does not exist. + * @return mixed + */ + public function getAttribute(string $name, $default = null); + + /** + * Return an instance with the specified derived request attribute. + * + * This method allows setting a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $value The value of the attribute. + * @return static + */ + public function withAttribute(string $name, $value): ServerRequestInterface; + + /** + * Return an instance that removes the specified derived request attribute. + * + * This method allows removing a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @return static + */ + public function withoutAttribute(string $name): ServerRequestInterface; +} diff --git a/vendor/psr/http-message/src/StreamInterface.php b/vendor/psr/http-message/src/StreamInterface.php new file mode 100644 index 00000000..a62aabb8 --- /dev/null +++ b/vendor/psr/http-message/src/StreamInterface.php @@ -0,0 +1,158 @@ + + * [user-info@]host[:port] + * + * + * If the port component is not set or is the standard port for the current + * scheme, it SHOULD NOT be included. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2 + * @return string The URI authority, in "[user-info@]host[:port]" format. + */ + public function getAuthority(): string; + + /** + * Retrieve the user information component of the URI. + * + * If no user information is present, this method MUST return an empty + * string. + * + * If a user is present in the URI, this will return that value; + * additionally, if the password is also present, it will be appended to the + * user value, with a colon (":") separating the values. + * + * The trailing "@" character is not part of the user information and MUST + * NOT be added. + * + * @return string The URI user information, in "username[:password]" format. + */ + public function getUserInfo(): string; + + /** + * Retrieve the host component of the URI. + * + * If no host is present, this method MUST return an empty string. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.2.2. + * + * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 + * @return string The URI host. + */ + public function getHost(): string; + + /** + * Retrieve the port component of the URI. + * + * If a port is present, and it is non-standard for the current scheme, + * this method MUST return it as an integer. If the port is the standard port + * used with the current scheme, this method SHOULD return null. + * + * If no port is present, and no scheme is present, this method MUST return + * a null value. + * + * If no port is present, but a scheme is present, this method MAY return + * the standard port for that scheme, but SHOULD return null. + * + * @return null|int The URI port. + */ + public function getPort(): ?int; + + /** + * Retrieve the path component of the URI. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Normally, the empty path "" and absolute path "/" are considered equal as + * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically + * do this normalization because in contexts with a trimmed base path, e.g. + * the front controller, this difference becomes significant. It's the task + * of the user to handle both "" and "/". + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.3. + * + * As an example, if the value should include a slash ("/") not intended as + * delimiter between path segments, that value MUST be passed in encoded + * form (e.g., "%2F") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.3 + * @return string The URI path. + */ + public function getPath(): string; + + /** + * Retrieve the query string of the URI. + * + * If no query string is present, this method MUST return an empty string. + * + * The leading "?" character is not part of the query and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.4. + * + * As an example, if a value in a key/value pair of the query string should + * include an ampersand ("&") not intended as a delimiter between values, + * that value MUST be passed in encoded form (e.g., "%26") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.4 + * @return string The URI query string. + */ + public function getQuery(): string; + + /** + * Retrieve the fragment component of the URI. + * + * If no fragment is present, this method MUST return an empty string. + * + * The leading "#" character is not part of the fragment and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.5. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.5 + * @return string The URI fragment. + */ + public function getFragment(): string; + + /** + * Return an instance with the specified scheme. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified scheme. + * + * Implementations MUST support the schemes "http" and "https" case + * insensitively, and MAY accommodate other schemes if required. + * + * An empty scheme is equivalent to removing the scheme. + * + * @param string $scheme The scheme to use with the new instance. + * @return static A new instance with the specified scheme. + * @throws \InvalidArgumentException for invalid or unsupported schemes. + */ + public function withScheme(string $scheme): UriInterface; + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; an empty string for the user is equivalent to removing user + * information. + * + * @param string $user The user name to use for authority. + * @param null|string $password The password associated with $user. + * @return static A new instance with the specified user information. + */ + public function withUserInfo(string $user, ?string $password = null): UriInterface; + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * An empty host value is equivalent to removing the host. + * + * @param string $host The hostname to use with the new instance. + * @return static A new instance with the specified host. + * @throws \InvalidArgumentException for invalid hostnames. + */ + public function withHost(string $host): UriInterface; + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * Implementations MUST raise an exception for ports outside the + * established TCP and UDP port ranges. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @param null|int $port The port to use with the new instance; a null value + * removes the port information. + * @return static A new instance with the specified port. + * @throws \InvalidArgumentException for invalid ports. + */ + public function withPort(?int $port): UriInterface; + + /** + * Return an instance with the specified path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified path. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * If the path is intended to be domain-relative rather than path relative then + * it must begin with a slash ("/"). Paths not starting with a slash ("/") + * are assumed to be relative to some base path known to the application or + * consumer. + * + * Users can provide both encoded and decoded path characters. + * Implementations ensure the correct encoding as outlined in getPath(). + * + * @param string $path The path to use with the new instance. + * @return static A new instance with the specified path. + * @throws \InvalidArgumentException for invalid paths. + */ + public function withPath(string $path): UriInterface; + + /** + * Return an instance with the specified query string. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified query string. + * + * Users can provide both encoded and decoded query characters. + * Implementations ensure the correct encoding as outlined in getQuery(). + * + * An empty query string value is equivalent to removing the query string. + * + * @param string $query The query string to use with the new instance. + * @return static A new instance with the specified query string. + * @throws \InvalidArgumentException for invalid query strings. + */ + public function withQuery(string $query): UriInterface; + + /** + * Return an instance with the specified URI fragment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified URI fragment. + * + * Users can provide both encoded and decoded fragment characters. + * Implementations ensure the correct encoding as outlined in getFragment(). + * + * An empty fragment value is equivalent to removing the fragment. + * + * @param string $fragment The fragment to use with the new instance. + * @return static A new instance with the specified fragment. + */ + public function withFragment(string $fragment): UriInterface; + + /** + * Return the string representation as a URI reference. + * + * Depending on which components of the URI are present, the resulting + * string is either a full URI or relative reference according to RFC 3986, + * Section 4.1. The method concatenates the various components of the URI, + * using the appropriate delimiters: + * + * - If a scheme is present, it MUST be suffixed by ":". + * - If an authority is present, it MUST be prefixed by "//". + * - The path can be concatenated without delimiters. But there are two + * cases where the path has to be adjusted to make the URI reference + * valid as PHP does not allow to throw an exception in __toString(): + * - If the path is rootless and an authority is present, the path MUST + * be prefixed by "/". + * - If the path is starting with more than one "/" and no authority is + * present, the starting slashes MUST be reduced to one. + * - If a query is present, it MUST be prefixed by "?". + * - If a fragment is present, it MUST be prefixed by "#". + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + * @return string + */ + public function __toString(): string; +} diff --git a/vendor/spatie/once/.editorconfig b/vendor/spatie/once/.editorconfig new file mode 100644 index 00000000..cd8eb86e --- /dev/null +++ b/vendor/spatie/once/.editorconfig @@ -0,0 +1,15 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/vendor/spatie/once/CHANGELOG.md b/vendor/spatie/once/CHANGELOG.md new file mode 100644 index 00000000..67624c48 --- /dev/null +++ b/vendor/spatie/once/CHANGELOG.md @@ -0,0 +1,82 @@ +# Changelog + +All notable changes to `once` will be documented in this file + +## 3.1.0 - 2022-04-21 + +## What's Changed + +- Rewrite phpunit tests to pest by @otsch in https://github.com/spatie/once/pull/73 + +## New Contributors + +- @otsch made their first contribution in https://github.com/spatie/once/pull/73 + +**Full Changelog**: https://github.com/spatie/once/compare/3.0.2...3.1.0 + +## 3.0.2 - 2022-02-04 + +## What's Changed + +- Add PHPStan doc blocks by @ThibaudDauce in https://github.com/spatie/once/pull/72 + +**Full Changelog**: https://github.com/spatie/once/compare/3.0.1...3.0.2 + +## 3.0.1 - 2021-07-04 + +- fix for caching static functions of different classes with the same name (#62) + +## 3.0.0 - 2020-11-04 + +- refactor to use a `WeakMap` +- drop support for PHP 7 + +## 2.2.1 - 2020-09-29 + +- allow PHP 8 + +## 2.2.0 - 2020-02-18 + +- support global functions + +## 2.1.3 - 2019-10-31 + +- differentiate between closures (#42) + +## 2.1.2 - 2019-08-05 + +- remove excess parameter in `get` on `cache` + +## 2.1.1 - 2019-06-27 + +- do not throw an error when using `once` in `eval` + +## 2.1.0 - 2019-06-19 + +- add enabling/disable the cache +- add `flush` method +- drop support for PHP 7.1 and below + +## 2.0.2 - 2018-12-27 + +- add ability to use `once` in static functions + +## 2.0.1 - 2018-01-31 + +- improvements around serialization + +## 2.0.0 - 2018-01-31 + +- ditch `__memoized` in favor of `Spatie\Once\Cache` + +## 1.1.0 - 2017-08-24 + +- add `MemoizeAwareTrait` + +## 1.0.1 - 2016-11-14 + +- fix cacheability of falsy return values + +## 1.0.0 - 2016-11-07 + +- initial release diff --git a/vendor/spatie/once/LICENSE.md b/vendor/spatie/once/LICENSE.md new file mode 100644 index 00000000..59e5ec59 --- /dev/null +++ b/vendor/spatie/once/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Spatie bvba + +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: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/spatie/once/README.md b/vendor/spatie/once/README.md new file mode 100644 index 00000000..d3be5ce9 --- /dev/null +++ b/vendor/spatie/once/README.md @@ -0,0 +1,206 @@ +

Social Card of Once

+ +# A magic [memoization](https://en.wikipedia.org/wiki/Memoization) function + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/spatie/once.svg?style=flat-square)](https://packagist.org/packages/spatie/once) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) +[![Build Status](https://img.shields.io/travis/spatie/once/master.svg?style=flat-square)](https://travis-ci.org/spatie/once) +[![Quality Score](https://img.shields.io/scrutinizer/g/spatie/once.svg?style=flat-square)](https://scrutinizer-ci.com/g/spatie/once) +[![StyleCI](https://styleci.io/repos/73020509/shield?branch=master)](https://styleci.io/repos/73020509) +[![Total Downloads](https://img.shields.io/packagist/dt/spatie/once.svg?style=flat-square)](https://packagist.org/packages/spatie/once) + +This package contains a `once` function. You can pass a `callable` to it. Here's quick example: + +```php +$myClass = new class() { + public function getNumber(): int + { + return once(function () { + return rand(1, 10000); + }); + } +}; +``` + +No matter how many times you run `$myClass->getNumber()` inside the same request you'll always get the same number. + +## Are you a visual learner? + +Under the hood, this package uses a PHP 8 Weakmap. [In this video](https://www.youtube.com/watch?v=-lFyHJqzfFU&list=PLjzBMxW2XGTwEwWumYBaFHy1z4W32TcjU&index=13), you'll see what a weakmap is, together with a nice demo of the package. + +## Support us + +[](https://spatie.be/github-ad-click/once) + +We invest a lot of resources into creating [best in class open source packages](https://spatie.be/open-source). You can support us by [buying one of our paid products](https://spatie.be/open-source/support-us). + +We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on [our contact page](https://spatie.be/about-us). We publish all received postcards on [our virtual postcard wall](https://spatie.be/open-source/postcards). + +## Installation + +You can install the package via composer: + +``` bash +composer require spatie/once +``` + +## Usage + +The `once` function accepts a `callable`. + +```php +$myClass = new class() { + public function getNumber(): int + { + return once(function () { + return rand(1, 10000); + }); + } +}; +``` + +No matter how many times you run `$myClass->getNumber()` you'll always get the same number. + +The `once` function will only run once per combination of argument values the containing method receives. + +```php +class MyClass +{ + /** + * It also works in static context! + */ + public static function getNumberForLetter($letter) + { + return once(function () use ($letter) { + return $letter . rand(1, 10000000); + }); + } +} +``` + +So calling `MyClass::getNumberForLetter('A')` will always return the same result, but calling `MyClass::getNumberForLetter('B')` will return something else. + +### Flushing the cache + +To flush the entire cache you can call: + +```php +Spatie\Once\Cache::getInstance()->flush(); +``` + +### Disabling the cache + +In your tests you probably don't want to cache values. To disable the cache you can call: + +```php +Spatie\Once\Cache::getInstance()->disable(); +``` + +You can re-enable the cache with + +```php +Spatie\Once\Cache::getInstance()->enable(); +``` + +### Octane compatibility + +> **Warning** +> +> This behaviour is in beta and needs to be tested by the community. You can find this topic [in discussion #79](https://github.com/spatie/once/discussions/79). + +In order to have `once` working properly in an Octane environment, `Cache::getInstance()->flush()` must be called when `OperationTerminated` event is triggered. You can configure it in `config/octane.php` file: + +```php +// config/octane.php + +OperationTerminated::class => [ + FlushTemporaryContainerInstances::class, + // DisconnectFromDatabases::class, + // CollectGarbage::class, + + FlushSpatieOnce::class, // we should create this class we have added here +], +``` + +And create the `FlushSpatieOnce:class`: + +```php +// app/Listeners/FlushSpatieOnce.php + +use Spatie\Once\Cache; + +class FlushSpatieOnce +{ + public function handle($event) + { + Cache::getInstance()->flush(); + } +} +``` + +## Under the hood + +The `once` function will execute the given callable and save the result in the `$values` property of `Spatie\Once\Cache`. This class [is a singleton](https://github.com/spatie/once/blob/9decd70a76664ff451fb10f65ac360290a6a50e6/src/Cache.php#L15-L27). When we detect that `once` has already run before, we're just going to return the value stored inside [the `$values` weakmap](https://github.com/spatie/once/blob/9decd70a76664ff451fb10f65ac360290a6a50e6/src/Cache.php#L11) instead of executing the callable again. + +The first thing it does is calling [`debug_backtrace`](http://php.net/manual/en/function.debug-backtrace.php). We'll use the output to determine in which function and class `once` is called and to get access to the `object` that function is running in. Yeah, we're already in voodoo-land. The output of the `debug_backtrace` is passed to a new instance of `Backtrace`. That class is just a simple wrapper, so we can work more easily with the backtrace. + +```php +$trace = debug_backtrace( + DEBUG_BACKTRACE_PROVIDE_OBJECT, 2 +)[1]; + +$backtrace = new Backtrace($trace); + +$object = $backtrace->getObject(); +``` + +Next, we calculate a `hash` of the backtrace. This hash will be unique per function `once` was called in and the values of the arguments that function receives. + +```php +$hash = $backtrace->getHash(); +``` + +Finally, we will check if there's already a value stored for the given hash. If not, then execute the given `$callback` and store the result in the weakmap of `Spatie\Once\Cache`. In the other case, we just return the value from that cache (the `$callback` isn't executed). + +```php +public function has(object $object, string $backtraceHash): bool +{ + if (! isset($this->values[$object])) { + + return false; + } + + return array_key_exists($backtraceHash, $this->values[$object]); +} +``` + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Testing + +``` bash +composer test +``` + +## Contributing + +Please see [CONTRIBUTING](https://github.com/spatie/.github/blob/main/CONTRIBUTING.md) for details. + +## Security + +If you've found a bug regarding security please mail [security@spatie.be](mailto:security@spatie.be) instead of using the issue tracker. + +## Credits + +- [Freek Van der Herten](https://github.com/freekmurze) +- [All Contributors](../../contributors) + +And a special thanks to [Caneco](https://twitter.com/caneco) for the logo ✨ + +Credit for the idea of the `once` function goes to [Taylor Otwell](https://twitter.com/taylorotwell/status/794622206567444481). The code for this package is based upon the code he was kind enough to share with us. + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/vendor/spatie/once/art/README.md b/vendor/spatie/once/art/README.md new file mode 100644 index 00000000..e4aa33a3 --- /dev/null +++ b/vendor/spatie/once/art/README.md @@ -0,0 +1,57 @@ +

+ +

+ +# Once Art + +The logo was inspired by the [Spatie](https://spatie.be) brand, and the well known minimal design of Laravel packages. + +## Fonts + +The logo is using the following fonts: + +- [Inter 600](https://fonts.google.com/specimen/Inter#600) + +## Colors + +| |#hex |rgb() | +|--- |--- |--- | +|![100](/art/palette/100.png)|`#E8F1F4`|`rgb(232,241,244)`| +|![200](/art/palette/200.png)|`#C6DDE4`|`rgb(198,221,228)`| +|![300](/art/palette/300.png)|`#A3C8D4`|`rgb(163,200,212)`| +|![400](/art/palette/400.png)|`#5E9EB3`|`rgb(94,158,179)` | +|![500](/art/palette/500.png)|`#197593`|`rgb(25,117,147)` | +|![600](/art/palette/600.png)|`#176984`|`rgb(23,105,132)` | +|![700](/art/palette/700.png)|`#0F4658`|`rgb(15,70,88)` | +|![800](/art/palette/800.png)|`#0B3542`|`rgb(11,53,66)` | +|![900](/art/palette/900.png)|`#08232C`|`rgb(8,35,44)` | + +## Requirements + +- A screen or a printer + +## Installation + +- Open the file +- *Right-click* on the image +- Choose **"Save image as…"** option + +## Maintainers + +**Once** logo is designed and maintained by [Caneco](https://twitter.com/caneco). + +## License + +All rights reserved, but with the following extra conditions: + +- It is **OK** to use the Once logo in the following cases: + - In marketing materials for technical events, e.g. meetups, hackathons, conferences and workshops that are related to Laravel. + - In open source projects related to Laravel. + - In technical articles/videos/books/papers for educational purposes. + - To illustrate a commercial product. + +- It is **NOT OK** to use the Once logo in the following cases without prior written consent from the copyright owners: + - Using the Once logo in a commercial product for purposes other than illustrating its integration. + - Sell physical products that uses the Once logo or its variants, e.g. t-shirts. + +By any means the owner reserves the right of final explanation for any use case not explicitly stated above. diff --git a/vendor/spatie/once/art/logomark.png b/vendor/spatie/once/art/logomark.png new file mode 100644 index 00000000..50b1fccf Binary files /dev/null and b/vendor/spatie/once/art/logomark.png differ diff --git a/vendor/spatie/once/art/logomark.svg b/vendor/spatie/once/art/logomark.svg new file mode 100644 index 00000000..a6f6c2a8 --- /dev/null +++ b/vendor/spatie/once/art/logomark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/vendor/spatie/once/art/logomark@2x.png b/vendor/spatie/once/art/logomark@2x.png new file mode 100644 index 00000000..5adb808b Binary files /dev/null and b/vendor/spatie/once/art/logomark@2x.png differ diff --git a/vendor/spatie/once/art/logomark@3x.png b/vendor/spatie/once/art/logomark@3x.png new file mode 100644 index 00000000..3a31a332 Binary files /dev/null and b/vendor/spatie/once/art/logomark@3x.png differ diff --git a/vendor/spatie/once/art/logomark@4x.png b/vendor/spatie/once/art/logomark@4x.png new file mode 100644 index 00000000..ff09e7fe Binary files /dev/null and b/vendor/spatie/once/art/logomark@4x.png differ diff --git a/vendor/spatie/once/art/palette/100.png b/vendor/spatie/once/art/palette/100.png new file mode 100644 index 00000000..5251db2c Binary files /dev/null and b/vendor/spatie/once/art/palette/100.png differ diff --git a/vendor/spatie/once/art/palette/200.png b/vendor/spatie/once/art/palette/200.png new file mode 100644 index 00000000..6b2368e5 Binary files /dev/null and b/vendor/spatie/once/art/palette/200.png differ diff --git a/vendor/spatie/once/art/palette/300.png b/vendor/spatie/once/art/palette/300.png new file mode 100644 index 00000000..214e112c Binary files /dev/null and b/vendor/spatie/once/art/palette/300.png differ diff --git a/vendor/spatie/once/art/palette/400.png b/vendor/spatie/once/art/palette/400.png new file mode 100644 index 00000000..cdfe741d Binary files /dev/null and b/vendor/spatie/once/art/palette/400.png differ diff --git a/vendor/spatie/once/art/palette/500.png b/vendor/spatie/once/art/palette/500.png new file mode 100644 index 00000000..a6b80534 Binary files /dev/null and b/vendor/spatie/once/art/palette/500.png differ diff --git a/vendor/spatie/once/art/palette/600.png b/vendor/spatie/once/art/palette/600.png new file mode 100644 index 00000000..a8cc07af Binary files /dev/null and b/vendor/spatie/once/art/palette/600.png differ diff --git a/vendor/spatie/once/art/palette/700.png b/vendor/spatie/once/art/palette/700.png new file mode 100644 index 00000000..9baf5680 Binary files /dev/null and b/vendor/spatie/once/art/palette/700.png differ diff --git a/vendor/spatie/once/art/palette/800.png b/vendor/spatie/once/art/palette/800.png new file mode 100644 index 00000000..8cf3d328 Binary files /dev/null and b/vendor/spatie/once/art/palette/800.png differ diff --git a/vendor/spatie/once/art/palette/900.png b/vendor/spatie/once/art/palette/900.png new file mode 100644 index 00000000..aaf127dd Binary files /dev/null and b/vendor/spatie/once/art/palette/900.png differ diff --git a/vendor/spatie/once/art/socialcard.png b/vendor/spatie/once/art/socialcard.png new file mode 100644 index 00000000..061c5cc6 Binary files /dev/null and b/vendor/spatie/once/art/socialcard.png differ diff --git a/vendor/spatie/once/composer.json b/vendor/spatie/once/composer.json new file mode 100644 index 00000000..5af750f1 --- /dev/null +++ b/vendor/spatie/once/composer.json @@ -0,0 +1,47 @@ +{ + "name": "spatie/once", + "description": "A magic memoization function", + "keywords": [ + "spatie", + "once", + "callable", + "memoization", + "cache" + ], + "homepage": "https://github.com/spatie/once", + "license": "MIT", + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.21", + "symfony/var-dumper": "^5.1" + }, + "autoload": { + "psr-4": { + "Spatie\\Once\\": "src" + }, + "files": [ + "src/functions.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Spatie\\Once\\Test\\": "tests" + } + }, + "scripts": { + "test": "vendor/bin/pest" + }, + "config": { + "sort-packages": true + } +} diff --git a/vendor/spatie/once/src/Backtrace.php b/vendor/spatie/once/src/Backtrace.php new file mode 100644 index 00000000..2a992be4 --- /dev/null +++ b/vendor/spatie/once/src/Backtrace.php @@ -0,0 +1,65 @@ +trace = $trace[1]; + + $this->zeroStack = $trace[0]; + } + + public function getArguments(): array + { + return $this->trace['args']; + } + + public function getFunctionName(): string + { + return $this->trace['function']; + } + + public function getObjectName(): ?string + { + return $this->trace['class'] ?? null; + } + + public function getObject(): mixed + { + if ($this->globalFunction()) { + return $this->zeroStack['file']; + } + + return $this->staticCall() ? $this->trace['class'] : $this->trace['object']; + } + + public function getHash(): string + { + $normalizedArguments = array_map(function ($argument) { + return is_object($argument) ? spl_object_hash($argument) : $argument; + }, $this->getArguments()); + + $prefix = $this->getObjectName() . $this->getFunctionName(); + if (str_contains($prefix, '{closure')) { + $prefix = $this->zeroStack['line']; + } + + return md5($prefix.serialize($normalizedArguments)); + } + + protected function staticCall(): bool + { + return $this->trace['type'] === '::'; + } + + protected function globalFunction(): bool + { + return ! isset($this->trace['type']); + } +} diff --git a/vendor/spatie/once/src/Cache.php b/vendor/spatie/once/src/Cache.php new file mode 100644 index 00000000..927ed43f --- /dev/null +++ b/vendor/spatie/once/src/Cache.php @@ -0,0 +1,85 @@ +values = new WeakMap(); + } + + public function has(object $object, string $backtraceHash): bool + { + if (! isset($this->values[$object])) { + + return false; + } + + return array_key_exists($backtraceHash, $this->values[$object]); + } + + public function get($object, string $backtraceHash): mixed + { + return $this->values[$object][$backtraceHash]; + } + + public function set(object $object, string $backtraceHash, mixed $value): void + { + $cached = $this->values[$object] ?? []; + + $cached[$backtraceHash] = $value; + + $this->values[$object] = $cached; + } + + public function forget(object $object): void + { + unset($this->values[$object]); + } + + public function flush(): self + { + $this->values = new WeakMap(); + + return $this; + } + + public function enable(): self + { + $this->enabled = true; + + return $this; + } + + public function disable(): self + { + $this->enabled = false; + + return $this; + } + + public function isEnabled(): bool + { + return $this->enabled; + } + + public function count(): int + { + return count($this->values); + } +} diff --git a/vendor/spatie/once/src/functions.php b/vendor/spatie/once/src/functions.php new file mode 100644 index 00000000..87169998 --- /dev/null +++ b/vendor/spatie/once/src/functions.php @@ -0,0 +1,45 @@ +getFunctionName() === 'eval') { + return call_user_func($callback); + } + + $object = $backtrace->getObject(); + + $hash = $backtrace->getHash(); + + $cache = Cache::getInstance(); + + if (is_string($object)) { + $object = $cache; + } + + if (! $cache->isEnabled()) { + return call_user_func($callback, $backtrace->getArguments()); + } + + if (! $cache->has($object, $hash)) { + $result = call_user_func($callback, $backtrace->getArguments()); + + $cache->set($object, $hash, $result); + } + + return $cache->get($object, $hash); +} diff --git a/vendor/wordpress-autoload.php b/vendor/wordpress-autoload.php new file mode 100644 index 00000000..913ec449 --- /dev/null +++ b/vendor/wordpress-autoload.php @@ -0,0 +1,13 @@ + array($vendorDir . '/alleyinteractive/wp-match-blocks/src/alley', $vendorDir . '/alleyinteractive/wp-type-extensions/src/alley'), + 'Alley\\WP\\WP_Curate' => array($baseDir . '/src'), +)); + +return $autoload;